2013-05-06 11 views
6

Próbuję zrzucić słownik w formacie pikla, używając polecenia "dump" dostępnego w pythonie. Rozmiar pliku słownika wynosi około 150 mb, ale wyjątek występuje, gdy zrzucono tylko 115 mb pliku. Wyjątkiem jest:MemoryError podczas pikowania danych w pythonie

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 

Jestem bardzo zdezorientowany, ponieważ ten sam kod działał dobrze wcześniej.

+1

Nie dotyczy to marynowania. Python żąda więcej pamięci z systemu operacyjnego, aby przechowywać więcej obiektów, a system operacyjny powiedział Pythonowi, że nie ma więcej pamięci dostępnej dla procesu. Ten błąd mógł się zdarzyć w dowolnym miejscu kodu. –

+0

Aby przetestować kod, próbowałem nawet załadować ten sam plik pikle (który wcześniej zrzuciłem), a następnie spróbowałem go ponownie zrzucić i dziwnie dostaję ten sam wyjątek. – tanzil

+0

Jak rozwiązać ten problem? A jak działało wcześniej? – tanzil

Odpowiedz

1

Czy wysypujesz tylko jeden przedmiot i to wszystko?

Jeśli wywołujesz zrzut wielokrotnie, wywołanie Pickler.clear_memo() między zrzutami spowoduje opróżnienie wewnętrznie zapisanych referencji wstecz (powodując "wyciek"). A twój kod powinien po prostu działać poprawnie ...

1

Czy próbowałeś tego?

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