I recently asked a question关于如何将大型python对象保存到文件中。我之前遇到过将大量Python字典转换为字符串并通过write()将它们写入文件的问题。现在我用的是泡菜。虽然它可以工作,但文件非常大(> 5 GB)。在处理这么大的文件方面,我几乎没有经验。我想知道在将这个pickle文件存储到内存之前压缩它是否会更快,甚至是可能的。
发布于 2014-05-07 01:31:27
我只想扩展一下phihag的答案。
当尝试序列化一个接近内存大小的对象时,应该避免使用/cPickle,因为为了序列化,它是requires additional memory of 1-2 times the size of the object的。这是真的,即使当它流传输到BZ2File。在我的例子中,我甚至耗尽了交换空间。
但是JSON (和链接文章中提到的HDF文件类似)的问题是它不能序列化元组,在我的数据中,元组被用作dict的键。这个问题没有很好的解决方案;我能找到的最好的解决方案是将元组转换为字符串,这需要一些内存,但比pickle少得多。现在,您还可以使用the ujson library,它比json库快得多。
对于由字符串组成的元组(要求字符串不包含逗号):
import ujson as json
from bz2 import BZ2File
bigdata = { ('a','b','c') : 25, ('d','e') : 13 }
bigdata = dict([(','.join(k), v) for k, v in bigdata.viewitems()])
f = BZ2File('filename.json.bz2',mode='wb')
json.dump(bigdata,f)
f.close()要重新组合元组,请执行以下操作:
bigdata = dict([(tuple(k.split(',')),v) for k,v in bigdata.viewitems()])或者,如果您的键是整数的2元组:
bigdata2 = { (1,2): 1.2, (2,3): 3.4}
bigdata2 = dict([('%d,%d' % k, v) for k, v in bigdata2.viewitems()])
# ... save, load ...
bigdata2 = dict([(tuple(map(int,k.split(','))),v) for k,v in bigdata2.viewitems()])这种方法相对于pickle的另一个优点是,在使用bzip2压缩时,json的压缩效果明显好于pickle。
https://stackoverflow.com/questions/7641592
复制相似问题