2013-05-06 16 views
6

Ich versuche, ein Wörterbuch in Pickle-Format zu entleeren, mit "Dump" -Befehl in Python zur Verfügung gestellt. Die Dateigröße des Wörterbuchs beträgt ungefähr 150 MB, aber eine Ausnahme tritt auf, wenn nur 115 MB der Datei ausgegeben werden. Die Ausnahme ist:MemoryError beim Picken von Daten in Python

Traceback (most recent call last): 
    File "C:\Python27\generate_traffic_pattern.py", line 32, in <module> 
    b.dump_data(way_id_data,'way_id_data.pickle') 
    File "C:\Python27\class_dump_load_data.py", line 8, in dump_data 
    pickle.dump(data,saved_file) 
    File "C:\Python27\lib\pickle.py", line 1370, in dump 
    Pickler(file, protocol).dump(obj) 
    File "C:\Python27\lib\pickle.py", line 224, in dump 
    self.save(obj) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\pickle.py", line 649, in save_dict 
    self._batch_setitems(obj.iteritems()) 
    File "C:\Python27\lib\pickle.py", line 663, in _batch_setitems 
    save(v) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\pickle.py", line 600, in save_list 
    self._batch_appends(iter(obj)) 
    File "C:\Python27\lib\pickle.py", line 615, in _batch_appends 
    save(x) 
    File "C:\Python27\lib\pickle.py", line 286, in save 
    f(self, obj) # Call unbound method with explicit self 
    File "C:\Python27\lib\pickle.py", line 599, in save_list 
    self.memoize(obj) 
    File "C:\Python27\lib\pickle.py", line 247, in memoize 
    self.memo[id(obj)] = memo_len, obj 
MemoryError 

Ich bin wirklich verwirrt, da mein gleicher Code früher gut funktionierte.

+1

Dies ist nicht spezifisch für Pickle. Python fordert mehr Speicher vom Betriebssystem an, um weitere Objekte zu speichern, und das Betriebssystem teilte Python mit, dass für den Prozess kein Speicher mehr verfügbar ist. Dieser Fehler könnte überall in Ihrem Code aufgetreten sein. –

+0

Um den Code zu testen, habe ich sogar versucht, die gleiche Pickle-Datei zu laden (die ich schon früher abgelegt habe) und dann versucht habe, sie erneut zu löschen, und seltsamerweise bekomme ich dieselbe Ausnahme. – tanzil

+0

Wie behebe ich dieses Problem? Und wie es früher funktioniert hat? – tanzil

Antwort

1

Sind Sie nur das eine Objekt, und das ist alles?

Wenn Sie dump mehrmals aufrufen, führt das Aufrufen von Pickler.clear_memo() zwischen Dumps zu einem Leeren der intern gespeicherten Rückwärtsreferenzen (wodurch das "Leck" verursacht wird). Und Ihr Code sollte einfach gut funktionieren ...

1

Haben Sie das versucht?

import cPickle as pickle 
p = pickle.Pickler(open("temp.p","wb")) 
p.fast = True 
p.dump(d) # d is your dictionary 
Verwandte Themen