I recently asked a question关于如何将大型python对象保存到文件中。我之前遇到过将大量Python字典转换为字符串并通过write()将它们写入文件的问题。现在我用的是泡菜。虽然它可以工作,但文件非常大(> 5 GB)。在处理这么大的文件方面,我几乎没有经验。我想知道在将这个pickle文件存储到内存之前压缩它是否会更快,甚至是可能的。
发布于 2011-10-04 08:03:06
当涉及到实现数据序列化时,Python代码将非常慢。如果你尝试用纯Python创建一个等价的Pickle,你会发现它会超级慢。幸运的是,执行该功能的内置模块相当不错。
除了cPickle之外,您还可以找到marshal模块,它的速度要快得多。但它需要一个真正的文件句柄(而不是来自一个类似文件的对象)。你可以通过import marshal as Pickle查看它们之间的区别。我不认为你可以做一个自定义的序列化程序,它比这个快得多……
这是一个实际的(不是很旧的) serious benchmark of Python serializers
发布于 2011-10-04 07:02:11
您可以使用bzip2压缩数据
from __future__ import with_statement # Only for Python 2.5
import bz2,json,contextlib
hugeData = {'key': {'x': 1, 'y':2}}
with contextlib.closing(bz2.BZ2File('data.json.bz2', 'wb')) as f:
json.dump(hugeData, f)像这样加载它:
from __future__ import with_statement # Only for Python 2.5
import bz2,json,contextlib
with contextlib.closing(bz2.BZ2File('data.json.bz2', 'rb')) as f:
hugeData = json.load(f)您也可以使用zlib或gzip压缩数据,但界面基本相同。然而,zlib和gzip的压缩率都会低于bzip2 (或lzma)的压缩率。
发布于 2011-10-04 07:03:12
更快,甚至是可能的,在写之前压缩这个pickle文件
当然,这是可能的,但没有理由尝试在内存中创建一个显式的压缩副本(它可能不适合!)在编写它之前,当您可以使用内置的标准库功能自动将其压缩时;)
参见http://docs.python.org/library/gzip.html。基本上,您可以使用以下命令创建一种特殊的流
gzip.GzipFile("output file name", "wb")然后完全像使用open(...) (或file(...) )创建的普通file一样使用它。
https://stackoverflow.com/questions/7641592
复制相似问题