Python/Numpy中的数据压缩

7

我正在考虑使用亚马逊云满足我的所有模拟需求。生成的模拟文件相当大,我想把它们转移到本地驱动器以便分析等。每次移动数据都需要付费,因此我希望将所有模拟解决方案压缩到尽可能小的大小。它们只是以.mat文件形式保存的numpy数组,使用以下方法:

import scipy.io as sio
sio.savemat(filepath, do_compression = True) 

我的问题是,使用python压缩存储、linux压缩或两者结合的方式,什么是压缩numpy数组(它们当前存储在.mat文件中,但我可以使用任何python方法来存储它们)的最佳方法?

我处于linux环境中,对任何类型的文件压缩都持开放态度。

3个回答

8

除非您了解数组的某些特殊信息(例如稀疏性或某种模式),否则您无法比默认压缩更好,甚至可能需要在其上使用gzip。实际上,如果您正在使用HTTP进行下载并且服务器已配置为执行压缩,则可能不需要对文件进行gzip压缩。良好的无损压缩算法很少有超过10%的差异。

如果savemat按广告所述工作,则可以在Python中全部获得gzip压缩:

import scipy.io as sio
import gzip

f_out = gzip.open(filepath_dot_gz, 'wb')
sio.savemat(f_out, do_compression = True)

谢谢,我想我可以使用gzip,但我不知道最好的选择是什么,看起来7za和rzip也很不错。 - tylerthemiler

3

此外,LZMA(也称为 xz)在压缩相对稀疏的numpy数组时具有非常优秀的压缩率,尽管在压缩过程中速度较慢(可能需要更多的内存)。

在Ubuntu中,可以通过 sudo apt-get install python-lzma 命令进行安装。

它像其他文件对象包装器一样使用,例如(用于加载pickle数据):

from lzma import LZMAFile
import cPickle as pickle

if fileName.endswith('.xz'):
   dataFile = LZMAFile(fileName,'r')
else:
   dataFile = file(fileName, 'ro')     
data = pickle.load(dataFile)

0

虽然它不一定会给你最高的压缩比,但我使用python-blosc将压缩的numpy数组保存到磁盘上时有很好的体验。它非常快速,并且与numpy集成得很好


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接