pickle -EOFError

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
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

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ß
BlackJack

@waki: Wie hast Du die Datei denn geschrieben? Bist Du sicher, dass Du da auch 'b' im Dateimodus hattest?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

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?
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

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...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Fuer mich sieht das so aus, als ging beim Schreiben etwas schief, also hoechstwahrscheinlich nicht.
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.
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

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)...
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

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.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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?
Benutzeravatar
noisefloor
User
Beiträge: 4262
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
waki
User
Beiträge: 133
Registriert: Dienstag 9. März 2010, 16:41

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nein, du musst dann den Rest wieder in die Datei schreiben.
Benutzeravatar
noisefloor
User
Beiträge: 4262
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Antworten