使用cPickle序列化大型字典会导致MemoryError
我正在为一组文档上的搜索引擎编写倒排索引。现在,我将索引存储为字典词典。也就是说,每个关键字都映射到docIDs->发生位置的字典。
数据模型看起来像:
{word:{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.6 Gb)。一旦我打电话给cPickle,我的内存使用率在崩溃之前就会猛增至80%。
为什么cPickle使用如此多的内存进行序列化?有没有更好的方法来解决这个问题?
没有找到相关结果
已邀请:
3 个回复
琶竞捆栓
锹缄
提孺局缎
这肯定不是实现这一目标的唯一方式(或必然是最佳方式)。 Document或Word表是否应与Location表分开,这取决于您的数据和典型用法。在您的情况下,“Word”表可能是一个单独的表,其中包含一些用于索引和唯一性的添加设置。