压缩测量数据文件

1 投票
3 回答
1037 浏览
提问于 2025-04-16 22:53

我从测量中得到的文本文件基本上是一个包含浮点数的表格,尺寸是1000x1000。这些文件大约占用15MB的空间,考虑到我每次会得到大约1000个结果文件,这样保存是不可接受的。所以我想尽可能压缩这些文件,而且不想丢失任何数据。我的想法是把这些数字分成大约1000个步骤,覆盖我预期的范围,然后保存这些数据。这样可以提供足够的分辨率。不过,我仍然需要考虑100万个数据点,因此最终的文件仍然大约是4MB。我可能无法进一步压缩它吗? 更大的问题是计算这些数据所需的时间。目前我估计每个文件大约需要10到12秒,所以处理1000个文件大约需要3个小时。这实在是太多了。我想出了这个算法,你有什么建议吗?可能还有更高效的算法,但我不是很擅长编程……

import numpy

data=numpy.genfromtxt('sample.txt',autostrip=True, case_sensitive=True)
out=numpy.empty((1000,1000),numpy.int16)
i=0
min=-0.5
max=0.5
step=(max-min)/1000
while i<=999:
    j=0
    while j<=999: 
        k=(data[i,j]//step)
        out[i,j]=k
        if data[i,j]>max:
            out[i,j]=500
        if data[i,j]<min:
            out[i,j]=-500
        j=j+1
    i=i+1
numpy.savetxt('converted.txt', out, fmt="%i")

谢谢你提供的任何建议!
Jakob

3 个回答

1

可以使用 zipfilebz2gzip 这些模块来从 Python 保存文件为 zip、bz2 或 gz 格式。自己写的压缩方案在合理的时间内几乎肯定会比这些通用的、经过优化和编译的解决方案更慢,而且压缩效果也会更差。还可以考虑听听 eumiro 的建议。

2

numpy.savez_compressed 这个功能可以让你把很多数组保存到一个压缩的二进制文件里。

不过,你也不能指望压缩得太厉害——比如说你有15GB的数据,压缩算法不可能让它变成200MB那么小。你可能需要舍弃一些数据,具体要保留多少,只有你自己能决定。

4

我看到你把numpy数组存储为文本文件。其实有一种更快、更省空间的方法:直接保存它。

如果你的浮点数可以用32位浮点数来存储,那就用这个:

data = numpy.genfromtxt('sample.txt',autostrip=True, case_sensitive=True)

data.astype(numpy.float32).dump(open('converted.numpy', 'wb'))

然后你可以用这个来读取:

data = numpy.load(open('converted.numpy', 'rb'))

这样文件的大小会是1000x1000x4字节,大约4MB。

最新版本的numpy支持16位浮点数。也许你的浮点数可以在这个范围内存储。

撰写回答