使用cPickle序列化大型字典会导致MemoryError

Ste*_*tto 8 python serialization pickle inverted-index

我正在为一组文档上的搜索引擎编写倒排索引.现在,我将索引存储为字典词典.也就是说,每个关键字都映射到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)
Run Code Online (Sandbox Code Playgroud)

在序列化之前,我的程序使用大约50%的内存(1.6 Gb).一旦我打电话给cPickle,我的内存使用率在崩溃之前就会猛增至80%.

为什么cPickle使用如此多的内存进行序列化?有没有更好的方法来解决这个问题?

Joh*_*ooy 10

cPickle需要使用一堆额外的内存,因为它会进行循环检测.如果您确定数据没有循环,则可以尝试使用编组模块