如何使大型python数据结构更高效地进行unpickle?

Dav*_*Eyk 2 python performance serialization pickle

我有一个约170万个"令牌"对象的列表,以及一个约130,000个"结构"对象的列表,这些对象引用令牌对象并将它们分组到结构中.在美好的一天,它的内存占用量约为800MB.

我正在使用__slots__以减少我的内存占用,所以我__getstate__返回一个可序列化值的元组,这些值会__setstate__重新回到原位.我也没有挑选所有的实例数据,只有5个令牌,7-9个结构,所有字符串或整数.

当然,我正在使用cPickle和HIGHEST_PROTOCOL,它恰好是2(python 2.6).生成的pickle文件大约为120MB.

在我的开发机器上,需要约2分钟来取出泡菜.我想更快地做到这一点.除了更快的硬件和我已经在做的事情之外,我可以使用哪些方法?

Set*_*son 10

Pickle不是存储大量类似数据的最佳方法.对于大型数据集来说,它可能会很慢,更重要的是,它非常脆弱:在源周围进行更改可能会轻易破坏所有现有数据集.(我建议阅读其中的腌菜实际上是:一堆字节码表达式.它会吓到你考虑其他数据存储/检索方法.)

您应该考虑使用PyTables,它使用HDF5(跨平台和所有东西)来存储任意大量的数据.您甚至不必立即将文件中的所有内容加载到内存中; 你可以分段访问它.你所描述的结构听起来很像是非常适合"table"对象,它有一个set字段结构(由固定长度字符串,整数,小Numpy数组等组成)并且可以非常高效地保存大量数据.为了存储元数据,我建议使用._v_attrs表的属性.