Dra*_*nis 8 python compression serialization pickle
默认情况下,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)
| 归档时间: |
|
| 查看次数: |
4269 次 |
| 最近记录: |