"einfrieren" eines Programms (Persistenz)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

Hi,
möchte die Ausführung eines Programms unterbrechen, einfrieren und den Zustand abspeichern und später das Programm an dieser Stelle fortsetzen. Also alles was man utner dem Begriff "Persistenz" versteht. Nun habe ich davon leider keine Ahnung und wollte mal fragen wo man da in Python ansetzt bzw. ob mir jmd ein Tutorial empfehlen kann.

Gruß und Danke
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Laden und speichern von Python Objekten auf die Festplatte: pickle
Bottle: Micro Web Framework + Development Blog
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Pickle kommt aber auch bis zu einem gewissen Grad an Komplexität zurecht bzw 3rd-Party Module sind nicht unbedingt "pickelbar" und ich fand das Zurückladen immer sehr fehleranfällig. Abhängig von der konkreten Situation würde ich mir wohl eher ein eigenes Format zu Speichern eines Programmzutands ausdenken und das benutzen (sinnvoll z.B. bei einem Spiel). Eventuell willst du dir auch mal shelve anschauen, welches auf `pickle` aufsetzt, sofern du bei dieser Technik bleiben willst.
Zuletzt geändert von snafu am Donnerstag 8. Juli 2010, 09:46, insgesamt 1-mal geändert.
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

Pickle nach zu programmieren halte ich wiederum für eine schlechte Idee. Entweder man nutzt von vornherein eine Datenbank für die Persistenz oder man baut auf bekannte, erprobte und austauschbare Datenformate.
Bottle: Micro Web Framework + Development Blog
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Der einzige Weg dieses Problem wirklich gut zu lösen ist ein eigener Interpreter der eine Unterbrechung nach einer Instruktion im bytecode erlaubt und den Status speichert.

Ein Alternative wäre die Anwendung wie eine Webanwendung zu schreiben, also möglichst ohne eigenen Status und mit allen relevanten Daten in einer Datenbank.

Mit pickle oder shelve kann man zwar einzelne Objekte speichern aber wenn es um eigene Objekte geht wird es schon schwierig, da muss man dann anfangen sich mit pickle genau auseinanderzusetzen und entsprechende Methoden zum implementieren. Selbst wenn man das hat kann man immernoch nur einzelne Objekte speichern und laden, wie man dass macht ist wieder eine andere Sache und hat großen Einfluss auf das Design. Desweiteren kann man ein Programm nicht anhalten wenn es in einer Funktion steckt, was Probleme aufwirft.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

@LiLaLaunebär: Beschreib' doch mal, was du genau vorhast... Den Spielstand eines Spiels speichern, eine stundenlange Berechnung an einer beliebigen stellen abbrechen und später wieder fortsetzen...

Gruß, noisefloor
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Wir nutzen Python in der Firma als Rezeptinterpreter für eine Steuerung und standen vor dem selben Problem.
Stackless Python war die Lösung. Der Stack wird dort anderes organisiert. Probier das mal.

Gruss
alpha
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

was ich genau vorhabe:
Ich habe eine Simulation geschrieben, die auf dem in Python geschriebenen Simulationspackage SimPy basiert. SimPy enthält quasi Klassen, mit denen man prozessorientierte Simulationen erstellen kann. Man erzeugt quasi Prozessklassen die dann etwas machen (z.B. warten oder scih gegenseitig beeinflussen) und SimPy simuliert dann die Interaktionen zwsichen den Prozessen und die Simulationszeit etc.
Nun möchte ich diese Simulation quasi zu einem gewissen Zeitpunkt stoppen um sie dan später wieder fortzusetzen. Leider habe ich bei SimPy noch nichts gefunden, was dies erlaubt. Aber es ist ja alles Python. Der Clou ist, dass ich eig nicht wirklich weiß, was dieses SimPy im Hintergrund so alles macht. Ich nutze die Methoden und Objekte/Prozesse und das wars...
Ich habe dann etwas gegoogelt und kam auf das Schlagwort Persistenz...da ich nicht weiß wo ich nun anfangen soll, habe ich hier mal nach nachgefragt...
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ok...

In der Theorie wäre dann die Lösung, dass du alle Werte, die die Simulation zum Zeitpunkt X charakterisieren, speicherst. Ob du dass dann via DB (z.B. SQLite), KV-Store (z.B. anydbm) oder dem shelve-Modul machst hinge von der Art der Daten ab.

Dazu müsste man aber wissen, wo du schon richtig sagst, was SimPy im Hintergrund macht, wie man an alle relevanten Daten rankommt und vor allem, wie man die Daten dem Programm unterschiebt und dann damit wieder startet...

Gruß, noisefloor
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Google findet ein Paper dazu: Saving and restarting SimPy simulations. Scheint aber nicht ganz trivial zu sein.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

ein ganz anderer, eher übler ;-) Workaround wäre, dafür extra eine virtuelle Maschine aufzusetzen und darin die Simulation laufen zu lassen. Die VM kann man ja heutzutage so ausschalten, dass der Zustand eingefroren wird und beim nächsten Start wieder "aufgetaut".

Gruß, noisefloor
Benutzeravatar
Defnull
User
Beiträge: 778
Registriert: Donnerstag 18. Juni 2009, 22:09
Wohnort: Göttingen
Kontaktdaten:

noisefloor hat geschrieben:Die VM kann man ja heutzutage so ausschalten, dass der Zustand eingefroren wird und beim nächsten Start wieder "aufgetaut".
Garnicht mal so eine blöde Idee. Sowas geht nämlich auch für einzelne Prozesse: http://cryopid.berlios.de/
Bottle: Micro Web Framework + Development Blog
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

noisefloor hat geschrieben:Die VM kann man ja heutzutage so ausschalten, dass der Zustand eingefroren wird und beim nächsten Start wieder "aufgetaut".
VirtualBox hätte ein passendes CommandLine-Interface, falls der Prozess-Freezer aus irgendeinem Grund nicht geeignet ist.

Prinzipiell finde ich die Idee auch nicht schlecht. Aus meiner Sicht ein minimaler Aufwand, von dem her durchaus geeignet, wenn die Nachteile (verzögerter Start, Ressourcen, ...) kein Problem sind.
„Lieber von den Richtigen kritisiert als von den Falschen gelobt werden.“
Gerhard Kocher

http://ms4py.org/
simlan
User
Beiträge: 6
Registriert: Montag 20. April 2009, 16:41

...mmh klingt kompliziert. Also es werden Objekte generiert und Attribute gesetzt(bei Simpy). Dann muesstes du alle Objekte packen und pickeln oder einfacher ne Objekt Datenbanken benutzten ( ZODB3) anschließend den ganzen Salat wieder rausholen und das an eine der run() funktionen schicken die es sicherlich gibt.


Gruß Sim

z.Bsp:

Code: Alles auswählen

if __name__ =="__main__" :
try:
        process(some)
        except KeyboardInterrupt:
               for i in dir() :
                     zodb.rootobject[str(i)]=i
                     transaction.commit()
 

      
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

ok, vielen Dank an alle, dann werde ich mich mal durch euere Infos wühlen und hoffe, dass es gelingt. Input ist jetzt ja eingies da, ich denke ich werde mal mit Pickle beginnen.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Gemäß meiner Tradition, heute nichts Sinnvolles zu Diskussionen beitragen zu können, möchte ich kurz darauf hinweisen, dass bereits vor über 30 Jahren Smalltalk die Möglichkeit bot, seinen kompletten Systemzustand einzufrieren (was man in diesem Kontext einen Snapshot nennt) und das System (auch Image genannt) daraus dann einfach das nächste Mal weiterlaufen kann. Tatsächlich war und ist dies der einzige Weg, wie man überhaupt speichern kann, wenn man die Maschine anhalten will.

Ein heutiges tagesaktuelles VisualWorks oder Squeak-System ist immer noch das selbe ursprüngliche Smalltalk-System, das um 1976 herum einmal gestartet wurde. Man hat es vielleicht angehalten und geklont und somit dupliziert, bevor es fortgesetzt wurde, aber es immer noch das *selbe* System, das niemals neu gestartet wurde. Tatsächlich gibt es AFAIK nicht (mehr) das Wissen (oder die Möglichkeit), Squeak oder VisualWorks irgendwie von Grund auf neu zu bootstrappen.

Welches andere Programm läuft (zugegeben mit Unterbrechungen) seit mehr als 30 Jahren, und das auch noch auf völlig unterschiedlichen Maschinen mit völlig geänderter Hardware? Ich finde das faszinierend.

Stefan
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich finde das ebenfalls interessant, sma. Hast du zu dem Thema vielleicht mal nen Link, wo man Details nachlesen kann?
LiLaLaunebär
User
Beiträge: 55
Registriert: Sonntag 11. April 2010, 14:41

ok, also das mit dem pickling is ja eig ne easy sache, bis auf die tatsache, dass generatoren nicht gepickelt werden können...der link von mkesper war da echt super (eig ja easy zu finden, wenn man weiß wonach mann suchen muss...aber wenn man von der Thematik so wie ich 0 plan hat...)
es wird aber auf grund der tatsache, dass Python in der version 2.x keine generatoren picklen kann, ein langer, langer, steiniger weg werden...
die thematik mit der virtuellen maschine ist in diesem fall leider nicht praktikabel.
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

snafu hat geschrieben:Ich finde das ebenfalls interessant, sma. Hast du zu dem Thema vielleicht mal nen Link, wo man Details nachlesen kann?
Damit kann ich leider so nicht direkt dienen. Was genau willst du nachlesen? Vielleicht fällt mir dann etwas ein. Smalltalk benutzt seit je eine virtuelle Maschine (und Peter Deutsch hatte dafür dann den just-in-time-Compiler erfunden, noch bevor es Java und den Begriff überhaupt gab), die es einfach macht, das System anzuhalten und fortzusetzen. Schwierigkeit ist nur, den Systemzustand bei Nutzung externer Ressourcen wie Dateien, Sockets usw. herzustellen. Da stößt man natürlich an Grenzen.

Stefan
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das meinte ich:
sma hat geschrieben:Ein heutiges tagesaktuelles VisualWorks oder Squeak-System ist immer noch das selbe ursprüngliche Smalltalk-System, das um 1976 herum einmal gestartet wurde. Man hat es vielleicht angehalten und geklont und somit dupliziert, bevor es fortgesetzt wurde, aber es immer noch das *selbe* System, das niemals neu gestartet wurde.
Aber ehrlich gesagt, inzwischen finde ich das gar nicht mehr so interessant. War wohl nur so eine Laune in dem Moment. :lol:
Antworten