文書コレクションの検索エンジンの逆インデックスを作成しています。今、私は辞書の辞書としてインデックスを保存しています。つまり、各キーワードは、docIDs->発生位置の辞書にマップされます。cPickleを使用して大規模な辞書を直列化すると、MemoryErrorが発生します。
データモデルは次のようになります。 {単語:{doc_name:[location_list]}}
メモリにインデックスを構築する正常に動作しますが、私がディスクにシリアル化しようとすると、私は、MemoryErrorを打ちます。私のコードは次のとおりです。
# Write the index out to disk
serializedIndex = open(sys.argv[3], 'wb')
cPickle.dump(index, serializedIndex, cPickle.HIGHEST_PROTOCOL)
私のプログラムは約50%のメモリ(1.6Gb)を使用しています。私がcPickleを呼び出すとすぐに、私のメモリ使用量はクラッシュする前に80%に急上昇します。
なぜcPickleはシリアル化に非常に多くのメモリを使用していますか?この問題に近づくための良い方法はありますか?
チャームのように働いた。信じられないほど単純な修正 - 基本的に "ピクル"を "マーシャル"に変更して完了しました。私はcPickleがサイクル検出を実行したことを認識しませんでした。マーシャルを使用することで、ディスクへの書き込みは20分ではなく数秒で完了し、メモリ消費量は30%から約0%に減少しました。ありがとう! –
シンプルなソリューションと簡潔な説明、素晴らしい100%。 – mitchus
おかげで、ありがとう@gnibbler! –