Seite 1 von 1
Objekte speichern, weil Instanzierung so rechenaufwendig ist
Verfasst: Mittwoch 19. August 2009, 12:40
von 4bit
Hallihallo,
habe eine eigene Klasse geschrieben, die zur Instanzierung ein paar Parametern braucht und dann eine ganze Menge ausrechnet und als Attribute speichert. Soweit so gut. Als nächstes erzeuge ich aber eine ganze Reihe dieser Instanzen, indem ich einen grossen Bereich von Parametern abdecke. Bis Python damit fertig ist, und mir die Liste der Objekte zurück gibt vergehen rund 6 Minuten. Das hat bei mir die Frage aufgeworfen: wie kann man Objekte in einer Datei speichern, um so beim nächsten Start von Python auf diese Zugriff zu haben, ohne erneute Instanzierungen durchführen zu müssen?
Ist bestimmt eine Frage der Kategorie FAQ.
Danke,
4bit.
Verfasst: Mittwoch 19. August 2009, 12:55
von cofi
Richtig. Es gibt ``pickle``. Allerdings muss auch das wieder eingelesen werden.
Ich wuerde aber sagen, dass dein Problem eher bei Ansatz/Implementierung liegt bzw es einfach so lange dauert.
Verfasst: Mittwoch 19. August 2009, 13:20
von 4bit
möchte ja garnicht behaupten, daß die Abläufe obtimal in Bezug auf Geschwindigkeit geschrieben sind, aber es geht auch wirklich um ein rechenaufwendiges Gebiet: Graphentheorie. Genauer gesagt habe ich eine Klasse geschrieben, die mit ein paar knappen Anweisungen (besagte Parameter) einen gerichteten Graph erzeugt. Ziel ist es eine Aussage wie diese zu treffen: Alle erzeugten Graphen der Parametermenge So-und-so (hoffentlich groß) erzeugen isomorphe Graphen.
Und diese vielen Isomorphie-Prüfungen schlagen eben ein bischen auf die Geschwindigkeit. Damit es nicht allzu lange dauert habe ich mir ein paar Tricks überlegt, um zu große Permutationen zu vermeiden. Damit diese Tricks funktionieren muss ich aber einmalig ein paar Hilfe-leistende-Mengen für jeden Graphen erzeugen. Und das dauert eben bei der Instanzierung.
Also angenommen ich besitzte die ausgeklügelsten Anweisungen diese Graphen zu erzeugen und es dauert immernoch zu lange... Gibts da nicht einen kurzen Python Befehl der ein einmal erzeugtes Python-Objekt speichert? Denke da an Matlabs Art und Weise Variablen zu speichern.
4biut.
Verfasst: Mittwoch 19. August 2009, 13:25
von lunar
Du wurdest doch schon auf Pickle verwiesen, dass dürfte für deine Zwecke genau das richtige sein.
Verfasst: Mittwoch 19. August 2009, 13:48
von Michael Schneider
Die Frage ist, ob Du die Objekte nun wirklich im Speicher benötigst, insbesondere ob Du wirklich alle zu jeder Zeit brauchst. Was Du meinst ist bestimmte eine Art Funktion, die einen Datenblock von der Festplatte direkt in den RAM schreibt und schon die Python-Objekte hat. Aber sowas wirst Du nicht finden.
Punkten kannst Du vielleicht mit kompilierten Modulen, die die Rechenarbeit der Isomorphieprüfungen für Dich übernehmen. Weiß nicht, ob in SciPy da etwas bei ist.
Und wenn die Generierung von Hilfsobjekten tatsächlich 6 Minuten dauert, dann hast Du entweder einen verdammt großen Arbeitsspeicher oder Du kannst bei der Generierung einiges optimieren.

Verfasst: Mittwoch 19. August 2009, 16:13
von Dav1d
cofi hat geschrieben:Richtig. Es gibt ``pickle``. Allerdings muss auch das wieder eingelesen werden.
Ich wuerde aber sagen, dass dein Problem eher bei Ansatz/Implementierung liegt bzw es einfach so lange dauert.
Was ist mit cPickle?
Verfasst: Mittwoch 19. August 2009, 16:37
von BlackJack
@Dav1d: Was soll damit sein? Das ist ein Modul in der Standardbibliothek von CPython.
Solange das "normale" `pickle` nicht mess- und spürbar zu langsam ist, lasse ich persönlich die Finger davon.
Verfasst: Mittwoch 19. August 2009, 16:57
von Dav1d
cPickle ist doch auch bei der 'normalen' Python Version dabei
und sry ich hab falsch gelesen -.-, ich dachte cofi meint, dass das pickle modul zu langsam ist.
mfg
Verfasst: Mittwoch 19. August 2009, 17:41
von nemomuk
Dav1d hat geschrieben:cPickle ist doch auch bei der 'normalen' Python Version dabei
Was ist bei dir bitte dann die "normale" Python Version?
Verfasst: Mittwoch 19. August 2009, 18:02
von Nocta
SchneiderWeisse hat geschrieben:Dav1d hat geschrieben:cPickle ist doch auch bei der 'normalen' Python Version dabei
Was ist bei dir bitte dann die "normale" Python Version?
Verwirr ihn doch nicht! :p
CPython ist "normal" @Dav1d
Verfasst: Mittwoch 19. August 2009, 18:03
von Dav1d
ok, verwende lieber pickle

Verfasst: Mittwoch 19. August 2009, 18:14
von cofi
Dav1d hat geschrieben:ok, verwende lieber pickle

Code: Alles auswählen
try:
import cPickle as pickle
except ImportError:
import pickle
Da beide die gleiche API anbieten kein Problem.