Python/Numpy中的数据压缩
我正在考虑使用亚马逊云来满足我所有的模拟需求。生成的模拟文件非常大,我想把它们转移到我的本地硬盘上,这样分析起来更方便。不过,转移数据是要收费的,所以我想把所有的模拟结果压缩到尽可能小的尺寸。它们现在是以 .mat 文件的形式保存的 numpy 数组,使用的是:
import scipy.io as sio
sio.savemat(filepath, do_compression = True)
所以我想问的是,压缩 numpy 数组的最佳方法是什么?(它们现在存储在 .mat 文件中,但我可以用任何 Python 方法来存储它们)是使用 Python 的压缩保存,还是 Linux 的压缩,或者两者结合?
我在 Linux 环境下,任何类型的文件压缩我都可以尝试。
3 个回答
0
虽然它可能不会给你最高的压缩比,但我用 python-blosc 保存压缩后的 numpy 数组到磁盘时,体验很好。这个工具非常快,并且 与 numpy 结合得很好。
3
LZMA(也叫做 xz
)在处理比较稀疏的numpy数组时能提供很好的压缩效果,不过压缩速度比较慢,而且可能需要更多的内存。
在Ubuntu系统上,可以通过命令 sudo apt-get install python-lzma
来安装它。
使用方法和其他文件对象的包装器差不多,比如用来加载已保存的数据:
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)
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)