2013-05-06 32 views
6

pythonで提供されている 'dump'コマンドを使用して、辞書をpickle形式にダンプしようとしています。ディクショナリのファイルサイズは約150 MBですが、ファイルの115 MBしかダンプされないと例外が発生します。例外は次のとおりです。Pythonでデータをpicklingする際のMemoryError

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 

私の同じコードが以前よりうまく動作していたので、私は本当に混乱しています。

+1

これはPickleに固有のものではありません。 Pythonは、より多くのオブジェクトを格納するためにOSからより多くのメモリを要求しており、OSはPythonに、そのプロセスで使用できるメモリがないことを伝えました。このエラーは、コード内のどこでも発生している可能性があります。 –

+0

コードをテストするために、同じピクルファイル(前にダンプしたもの)をロードしようとしても、もう一度ダンプしようとしましたが、間違いなく同じ例外が発生しています。 – tanzil

+0

この問題を解決するにはどうすればよいですか?それは以前のようにどうしていたのですか? – tanzil

答えて

1

あなたは1つのオブジェクトだけをダンプしていますか?

ダンプを何度も呼び出す場合は、ダンプ間にPickler.clear_memo()を呼び出すと、内部的に格納されているバックリファレンスがフラッシュされます( 'リーク'が発生します)。あなたのコードは正常に動作するはずです...

1

これは試しましたか?

import cPickle as pickle 
p = pickle.Pickler(open("temp.p","wb")) 
p.fast = True 
p.dump(d) # d is your dictionary 
関連する問題