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

2022-04-07 00:00:00 python pickle compression serialization

问题描述

发件人the Python documentation:

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

我将在一个运行了几个小时的过程结束时序列化几GB的数据,我希望结果在磁盘上尽可能小。但是,Python offers several different ways to compress data。

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

压缩和解压缩的时间并不重要,但此过程用于生成数据的时间会使反复试验变得不便。


解决方案

我使用一个已腌渍的对象进行了一些测试,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))

相关文章