压缩序列化 Python 数据的最节省空间的方法是什么?

Dra*_*nis 8 python compression serialization pickle

Python 文档

默认情况下,pickle 数据格式使用相对紧凑的二进制表示。如果您需要最佳大小特征,您可以有效地压缩腌制数据。

我将在运行几个小时的进程结束时序列化几 GB 的数据,我希望结果在磁盘上尽可能小。然而,Python 提供了几种不同的方式来压缩数据

是否有其中一种对腌制文件特别有效?我正在酸洗的数据主要由嵌套字典和字符串组成,所以如果有更有效的方法来压缩例如 JSON,那也可以。

压缩和解压缩的时间并不重要,但此过程生成数据所需的时间使反复试验不方便。

mit*_*hen 15

只需添加一个替代方案即可轻松为我提供最高的压缩比,而且最重要的是速度如此之快,我确信我在某个地方犯了错误(我没有)。真正的好处是解压速度也非常快,因此任何读取大量预处理数据的程序都将从中受益匪浅。一个潜在的警告是,这里某处提到了“小数组(<2GB)” ,但看起来有办法解决这个问题。或者,如果您像我一样懒惰,则通常可以选择分解数据。

一些聪明的cookie想出了python-blosc根据他们的文档,这是一个“高性能压缩机” 。我是从这个问题的答案中得到的。

通过例如pip install blosc或安装后conda install python-blosc,您可以非常轻松地压缩腌制数据,如下所示:

import blosc
import numpy as np
import pickle

data = np.random.rand(3, 3, 1e7)

pickled_data = pickle.dumps(data)  # returns data as a bytes object
compressed_pickle = blosc.compress(pickled_data)

with open("path/to/file/test.dat", "wb") as f:
    f.write(compressed_pickle)
Run Code Online (Sandbox Code Playgroud)

并阅读它:

with open("path/to/file/test.dat", "rb") as f:
    compressed_pickle = f.read()

depressed_pickle = blosc.decompress(compressed_pickle)
data = pickle.loads(depressed_pickle)  # turn bytes object back into data
Run Code Online (Sandbox Code Playgroud)

我使用的是 Python 3.7,甚至没有查看所有不同的压缩选项,我得到的压缩比约为 12,并且读取 + 解压缩 + 加载压缩的 pickle 文件比加载未压缩的 pickle 文件花费了几分之一秒的时间。

我写这篇文章更多是为了自己的参考,但我希望其他人会发现这很有用。

和平乌特


Gab*_*lli 12

我使用 Pickled 对象做了一些测试,lzma得到了最好的压缩。

但是您的结果可能会因您的数据而异,我建议您使用您自己的一些示例数据对其进行测试。

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/17/2019  10:05 PM       23869925 no_compression.pickle
-a----        9/17/2019  10:06 PM        6050027 gzip_test.gz
-a----        9/17/2019  10:06 PM        3083128 bz2_test.pbz2
-a----        9/17/2019  10:07 PM        1295013 brotli_test.bt
-a----        9/17/2019  10:06 PM        1077136 lmza_test.xz
Run Code Online (Sandbox Code Playgroud)

使用的测试文件(您需要pip install brotli或删除该算法):

Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        9/17/2019  10:05 PM       23869925 no_compression.pickle
-a----        9/17/2019  10:06 PM        6050027 gzip_test.gz
-a----        9/17/2019  10:06 PM        3083128 bz2_test.pbz2
-a----        9/17/2019  10:07 PM        1295013 brotli_test.bt
-a----        9/17/2019  10:06 PM        1077136 lmza_test.xz
Run Code Online (Sandbox Code Playgroud)