MemoryError mit Pickle in Python
Ich bin der Bearbeitung einige Daten, und ich habe abgelegt die Ergebnisse in drei Wörterbücher, und ich habe Sie gerettet, um die Festplatte mit Gurke. Jedes Wörterbuch hat 500-1000MB.
Nun ich bin laden Sie mit:
import pickle
with open('dict1.txt', "rb") as myFile:
dict1 = pickle.load(myFile)
Aber schon beim laden das erste Wörterbuch, das ich bekommen:
*** set a breakpoint in malloc_error_break to debug
python(3716,0xa08ed1d4) malloc: *** mach_vm_map(size=1048576) failed (error code=3)
*** error: can't allocate region securely
*** set a breakpoint in malloc_error_break to debug
Traceback (most recent call last):
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 858, in load
dispatch[key](self)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1019, in load_empty_dictionary
self.stack.append({})
MemoryError
Wie man dieses Problem lösen? Mein Rechner hat 16 GB RAM, so finde ich es ungewöhnlich, dass das laden eine 800MB-Wörterbuch abstürzt. Was finde ich auch ungewöhnlich ist, dass es keine Probleme gab beim speichern der Wörterbücher.
Weiter, in Zukunft Plane ich, um weitere Daten, die sich in größeren Wörterbüchern (3-4GB auf der Festplatte), so dass jede Beratung, wie die Verbesserung der Effizienz wird geschätzt.
Es hängt von Ihrem Betriebssystem, wie viel Speicher ein Prozess zuweisen dürfen.
Größe ist die Größe der Datei auf der Festplatte. Ich bin mit Mac OS 10.10. Gibt es eine Möglichkeit, einzustellen, wie viel Speicher darf umgelegt werden?
800 MB an Daten nicht übersetzen zu 800MB Speicherauslastung; es könnte größer sein, oder es könnte kleiner sein, aber in der Regel größer. Wie haben Sie zu produzieren, diese Gurken in den ersten Platz?
Und wie groß war Ihre
dict1
dann? Man müsste mit sys.getsizeof()
rekursiv um den Speicherbedarf des Objekts. Das footprint ist abhängig von OS, und wenn Sie ein 32-bit-oder 64-bit-Prozess.InformationsquelleAutor flotr | 2015-01-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Ihre Daten in den Wörterbüchern
numpy
arrays, es gibt Pakete (wiejoblib
undklepto
), die machen das marinieren von großen arrays effizient, da sowohl dieklepto
undjoblib
verstehen, wie minimaler staatlicher Repräsentation für einenumpy.array
. Wenn Sie nicht überarray
Daten, mein Vorschlag wäre, die Nutzungklepto
zum speichern der Wörterbuch-Einträge in mehreren Dateien (anstatt einer einzelnen Datei) oder zu einer Datenbank.Siehe meine Antwort auf eine sehr eng verbundene Frage https://stackoverflow.com/a/25244747/2379433, wenn Sie sind ok mit Beizen in mehrere Dateien anstatt einer einzigen Datei, speichern/laden Sie Ihre Daten in parallelen, oder möchte einfach Experimentieren Sie mit einer storage-format-und backend, um zu sehen, was funktioniert am besten für Ihren Fall. Siehe auch: https://stackoverflow.com/a/21948720/2379433 für andere potenzielle Verbesserungen, und auch hier: https://stackoverflow.com/a/24471659/2379433.
Als Sie die links oben diskutiert, könnten Sie
klepto
-- das bietet Ihnen die Möglichkeit, einfach speichern Sie die Wörterbücher auf die Festplatte oder eine Datenbank mit einem einheitlichen API.klepto
können Sie auch wählen Sie ein Speicherformat (pickle
,json
usw.) --auchHDF5
(oder eine SQL-Datenbank) ist eine weitere gute option, da es ermöglicht den parallelen Zugriff.klepto
nutzen können, beide spezialisiert Gurke Formate (wienumpy
's) und Kompression (wenn Sie sich über Größe und nicht die Geschwindigkeit der Zugriff auf die Daten).klepto
gibt Ihnen die option zum speichern der Wörterbuch mit "all-in-one" - Datei oder "ein-Eintrag-pro" - Datei, und auch nutzen können multiprocessing oder multithreading-was bedeutet, dass Sie können speichern und laden Sie die Wörterbuch-Artikel zu/von den backend-parallel. Für Beispiele, siehe die links oben.InformationsquelleAutor Mike McKerns
Dies ist ein inhärentes problem von Gurke,
die ist für den Gebrauch mit eher kleinen Mengen
Daten. Die Größe der Wörterbücher, wenn geladen in den Speicher,
sind um ein Vielfaches größer als auf der Festplatte.
Nach dem laden einer pickle-Datei von 100MB Sie möglicherweise auch haben
ein Wörterbuch mit fast 1GB oder so.
Es gibt einige Formeln, die auf der web-zur Ermittlung der Zuschläge, aber ich kann nur empfehlen, sich über einige
anständige Datenbank wie MySQL oder PostgreSQL für solche Datenmengen.
InformationsquelleAutor inixmon
Ich nehme Sie verwenden, 32-bit-Python und es hat 4 GB begrenzt. Sie sollten die Verwendung von 64 bit statt 32 bit. Ich habe versucht, meine eingelegten dict über 1,7 GB, und ich bekam keine problem, außer die Zeit geht mehr.
InformationsquelleAutor Jett