Seite 1 von 1

pickle -EOFError

Verfasst: Montag 31. Januar 2011, 22:43
von waki
Guten Tag,
ich hab gerade ein Programm geschrieben, welches mit Pickle eine große Menge von Daten in eine Datei inform eines Dictionaries speichert. Nun gehts das bei kleiner Datenmenge gut, aber hat sie etwa 1 GB, so bekomme ich einen EOFError. Kann ich diesen i-wie umgehen oder die Datei Stück für Stück einlesen? Wär relativ wichtig die Daten wieder herauszubekommen, da ich leider das Programm an richtigen Daten getestet habe, da es bei den Testdaten funktioniert hat und nun hat das Programm alles gepickelt und ich bekomms nichtmehr heraus ^^

Code: Alles auswählen

quelle = open("daten.psx", "rb")
self.files = pickle.load(quelle)
quelle.close()
Herzlich Dank schonmal


Gruß

Re: pickle -EOFError

Verfasst: Montag 31. Januar 2011, 23:24
von BlackJack
@waki: Wie hast Du die Datei denn geschrieben? Bist Du sicher, dass Du da auch 'b' im Dateimodus hattest?

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 07:12
von Hyperion
Was passiert denn eigentlich, wenn man an die Grenze des verfügbaren RAMs stößt? Ist Python da - ähnlich wie die JVM - a priori beschränkt? Oder wird das OS da swappen?

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 12:51
von Leonidas
Hyperion hat geschrieben:Was passiert denn eigentlich, wenn man an die Grenze des verfügbaren RAMs stößt? Ist Python da - ähnlich wie die JVM - a priori beschränkt? Oder wird das OS da swappen?
CPython verhält sich wie jedes "normale" Programm, also wird so viel Speicher ausnutzen, wie viel das OS erlaubt. Wenn es nicht so viel physikalischen Speicher gibt, dann kommt Virtual Memory ins Spiel. Es gibt aber auch ein Konzept von MemoryErrors (zum Beispiel wenn ein ``malloc()`` fehlschlägt).

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 13:52
von waki
BlackJack hat geschrieben:@waki: Wie hast Du die Datei denn geschrieben? Bist Du sicher, dass Du da auch 'b' im Dateimodus hattest?

Code: Alles auswählen

quelle = open("daten.psx", "wb")
pickle.dump(self.files, quelle)
quelle.close()
Jop, habe es mit "wb" geschrieben. Ist es nicht möglich die Daten wieder herauszubekommen?

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 14:14
von waki
Ok, irgendwie wirft mein Programm jetzt einen "ValueError: insecure string pickle" wenn ich es mit "rb" ausführe. Jetzt habe gerade wo gesehen, da hats einer einfach nur mit open("daten.psx") geöffnet. Habs auch probiert, dann passiert ne Zeit nichts und dann kommt wieder der EOF-Error...

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 14:23
von cofi
Fuer mich sieht das so aus, als ging beim Schreiben etwas schief, also hoechstwahrscheinlich nicht.

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 14:25
von BlackJack
@waki: Pickle-Daten müssen mit 'wb' bzw. 'rb' geöffnet werden, weil es Binärdaten sind. Sonst können "kaputte" Daten geschrieben werden, oder beim Einlesen kann unter bestimmten Umständen (=Windows) der Lesevorgang abgebrochen werden.

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 15:12
von waki
Ok, also pickle funktioniert mir nicht ausreichend für meinen zweg, wie speicher ich den am besten Datenmengen die über 1 - 2GB herausgehen in einer Datei, damit ich mit ihnen später weiterarbeiten kann?

€: Andere Frage, ist es möglich nur einen bestimmten Teil einer Datei auszulesen? Also man kann ja mit obj.read(buff) einen bestimmten Teil auslesen, aber es wird ja immer von ANfang der Datei dann ausgelsen. Kann ich auch angeben von WO bis wo ich es auslesen will? also wie bei einem String? Also z.B. obj.read(50:241)...

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 15:30
von cofi
Zur anderen Frage: Ja, mit `file.seek` kannst du den Stand in der Datei veraendern.

Aber ich glaube bei den Datenmengen und mit der Anforderung von beliebigen Positionen zu lesen bist du mit einer Datenbank besser aufgehoben.

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 15:35
von waki
Das hab ich schon versucht, ich wollte immer den Inhalt in eine Datei in eine Tabelle eintragen, und die Datenbank hatte dann ein Problem mit der Größe oder so.

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 16:16
von /me
waki hat geschrieben:Das hab ich schon versucht, ich wollte immer den Inhalt in eine Datei in eine Tabelle eintragen, und die Datenbank hatte dann ein Problem mit der Größe oder so.
Dieses "den Inhalt in eine Datei in eine Tabelle eintragen" klingt so, als wolltest du ein einziges BLOB-File in der Datenbank speichern. Das würde nun natürlich keinen Sinn haben.

Sind die Daten denn überhaupt nicht strukturiert?

Re: pickle -EOFError

Verfasst: Dienstag 1. Februar 2011, 20:42
von noisefloor
Hallo,
waki hat geschrieben:Ok, also pickle funktioniert mir nicht ausreichend für meinen zweg, wie speicher ich den am besten Datenmengen die über 1 - 2GB herausgehen in einer Datei, damit ich mit ihnen später weiterarbeiten kann?
SQLAlchemy kann in DBs pickeln. Dann kann zumindest kein anderer an der Daten rum fummeln. ;-)
Redis 1.x kann 1 GB pro Datensatz (vllt.mal checken, ob das aktuelle Redis 2.x mehr kann) speichern.
Mit CouchDB kannst du JSON-Objekte in der DB speichern. Weiß aber gerade nicht, wo da das Speicherlimit ist...

Ansonsten macht es, wie /me schon sagt / fragt vllt. Sinn, die Daten zu strukturieren und "häppchenweise" zu speichern.

Gruß, noisefloor

Re: pickle -EOFError

Verfasst: Mittwoch 2. Februar 2011, 16:45
von waki
Andere Frage, ich würde gerne einen bestimmten Teil aus einer Datei löschen, also z.B.: file.delete(5:100)
Mit file.truncate(size) kann ich angeben VON wo es löschen soll, aber nicht BIS wo es löschen soll. Gibt es eine Funktion die mir das ermöglicht, ohne dass ich die komplette Datei einlesen muss?

Re: pickle -EOFError

Verfasst: Mittwoch 2. Februar 2011, 17:10
von cofi
Nein, du musst dann den Rest wieder in die Datei schreiben.

Re: pickle -EOFError

Verfasst: Mittwoch 2. Februar 2011, 21:14
von noisefloor
Hallo,

Nachtrag:
Mit CouchDB kannst du JSON-Objekte in der DB speichern. Weiß aber gerade nicht, wo da das Speicherlimit ist...
4 GB in der Default-Konfiguration.

Gruß, noisefloor