首页 > 解决方案 > 压缩序列化 Python 数据最节省空间的方法是什么?

问题描述

Python 文档

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

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

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

压缩和解压缩的时间并不重要,但是这个过程生成数据所花费的时间使得试错很不方便。

标签: pythonserializationcompressionpickle

解决方案


我使用 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

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

import bz2
import gzip
import lzma
import pickle

import brotli


class SomeObject():

    a = 'some data'
    b = 123
    c = 'more data'

    def __init__(self, i):
        self.i = i


data = [SomeObject(i) for i in range(1, 1000000)]

with open('no_compression.pickle', 'wb') as f:
    pickle.dump(data, f)

with gzip.open("gzip_test.gz", "wb") as f:
    pickle.dump(data, f)

with bz2.BZ2File('bz2_test.pbz2', 'wb') as f:
    pickle.dump(data, f)

with lzma.open("lmza_test.xz", "wb") as f:
    pickle.dump(data, f)

with open('no_compression.pickle', 'rb') as f:
    pdata = f.read()
    with open('brotli_test.bt', 'wb') as b:
        b.write(brotli.compress(pdata))

推荐阅读