用Python存储大文件的最快方法

2024-06-16 13:52:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 文件对象内存字符串gt字典经验pickle
3条回答

可以使用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)

您还可以使用zlibgzip使用几乎相同的接口压缩数据。然而,zlib和gzip的压缩率都将低于bzip2(或lzma)的压缩率。

在实现数据序列化时,Python代码会非常慢。 如果您尝试在纯Python中创建一个与Pickle等价的工具,您将看到它将非常慢。 幸运的是,执行这些功能的内置模块非常好。

除了cPickle,您还可以找到marshal模块,它的速度要快得多。 但它需要一个真正的文件句柄(不是来自类似文件的对象)。 你可以import marshal as Pickle看到区别。 我不认为你能做一个定制的序列化程序比这个快得多。。。

这是一个实际的(不太老的)serious benchmark of Python serializers

faster, or even possible, to zip this pickle file prior to [writing]

当然这是可能的,但是没有理由尝试在内存中创建一个显式的压缩副本(它可能不适合!)在编写之前,当您可以使用内置的标准库功能自动使它在编写时被压缩时,;)

http://docs.python.org/library/gzip.html。基本上,你可以用

gzip.GzipFile("output file name", "wb")

然后像用open(...)(或者file(...))创建的普通file一样使用它。

相关问题 更多 >