Python/Numpy中的数据压缩

7 投票
3 回答
3769 浏览
提问于 2025-04-16 23:55

我正在考虑使用亚马逊云来满足我所有的模拟需求。生成的模拟文件非常大,我想把它们转移到我的本地硬盘上,这样分析起来更方便。不过,转移数据是要收费的,所以我想把所有的模拟结果压缩到尽可能小的尺寸。它们现在是以 .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)

撰写回答