压缩序列化的Python数据最节省空间的方法是什么?
问题描述
发件人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))
相关文章