python - 压缩序列化 Python 数据最节省空间的方法是什么?
问题描述
默认情况下,pickle 数据格式使用相对紧凑的二进制表示。如果您需要最佳尺寸特征,您可以有效地压缩腌制数据。
在运行几个小时的进程结束时,我将序列化几 GB 的数据,我希望结果在磁盘上尽可能小。但是,Python 提供了几种不同的数据压缩方式。
是否有其中一种对腌制文件特别有效?我腌制的数据主要由嵌套字典和字符串组成,所以如果有更有效的压缩方式,例如 JSON,那也可以。
压缩和解压缩的时间并不重要,但是这个过程生成数据所花费的时间使得试错很不方便。
解决方案
我使用 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))
推荐阅读
- bash - 匹配负整数或负浮点数
- ios - SwiftUI 搜索栏
- css - 梯形作为css3中的页面背景?
- json - 使用 azure logic app 编辑 json 内容
- javascript - 如果 Postman 中的测试失败(CollectionVariable?),则触发新请求
- vue.js - v-for 中的 V-model 正在填充所有输入
- javascript - 如何通过JS调用在Django模板标签中使用js变量来更新html内容?
- python-3.x - 多类分类机器学习
- macos - 无法在 Mac 上执行 FastX Toolkit
- request - 测试已完成的链链接 oracle 请求以太/安全帽的最佳实践是什么?