我有一个约170万个“令牌”对象的列表,以及一个约130,000个“结构”对象的列表,这些对象引用令牌对象并将它们分组到结构中。在美好的一天,这是一个约800MB的内存占用。
我正在使用__slots__
来减少内存占用,因此我的__getstate__
会返回一个可序列化值的元组,__setstate__
会重新插入到位。我也没有挑选所有的实例数据,只有5个令牌,7-9个结构,所有字符串或整数。
当然,我正在使用cPickle和HIGHEST_PROTOCOL,它恰好是2(python 2.6)。生成的pickle文件大约为120MB。
在我的开发机器上,需要约2分钟才能打开泡菜。我想更快地做到这一点。除了更快的硬件和我现在正在做的事情之外,我可以使用哪些方法?
答案 0 :(得分:10)
Pickle不是存储大量类似数据的最佳方法。对于大型数据集来说,它可能会很慢,更重要的是,它非常脆弱:在源周围进行更改可能会轻易破坏所有现有数据集。 (我建议读一下它的核心究竟是什么:一堆字节码表达式。它会吓到你考虑其他的数据存储/检索方式。)
您应该考虑使用PyTables,它使用HDF5(跨平台和所有内容)来存储任意大量的数据。您甚至不必立即将文件中的所有内容加载到内存中;你可以分段访问它。你描述的结构听起来很适合表格"表格#34; object,具有set字段结构(由固定长度字符串,整数,小Numpy数组等组成),可以非常有效地保存大量字段。为了存储元数据,我建议使用表格的._v_attrs
属性。