首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中存储大文件的最快方法

在Python中存储大文件的最快方法
EN

Stack Overflow用户
提问于 2011-10-04 06:55:10
回答 5查看 16.7K关注 0票数 12

I recently asked a question关于如何将大型python对象保存到文件中。我之前遇到过将大量Python字典转换为字符串并通过write()将它们写入文件的问题。现在我用的是泡菜。虽然它可以工作,但文件非常大(> 5 GB)。在处理这么大的文件方面,我几乎没有经验。我想知道在将这个pickle文件存储到内存之前压缩它是否会更快,甚至是可能的。

EN

Stack Overflow用户

发布于 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库快得多。

对于由字符串组成的元组(要求字符串不包含逗号):

代码语言:javascript
运行
复制
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()

要重新组合元组,请执行以下操作:

代码语言:javascript
运行
复制
bigdata = dict([(tuple(k.split(',')),v) for k,v in bigdata.viewitems()])

或者,如果您的键是整数的2元组:

代码语言:javascript
运行
复制
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。

票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7641592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档