压缩测量数据文件

时间:2011-08-04 13:20:10

标签: python compression numpy data-compression

从测量我得到的文本文件基本上包含浮点数表,尺寸为1000x1000。这些占用大约15MB的空间,考虑到我在一系列中获得大约1000个结果文件,这是不可接受的。所以我试图在不丢失数据的情况下尽可能地压缩它们。我的想法是在我期望的范围内将数字分组为~1000步并保存。这将提供足够的分辨率。但是我仍然需要考虑1.000.000点,因此我的结果文件仍然是大约4MB。我可能不能再进一步压缩了吗? 更大的问题是计算时间。现在我估计每个文件10-12秒,所以1000个文件约3小时。 WAAAAY很多。这是我提出的算法,你有什么建议吗?可能会有更高效的算法,但我不是一个程序员...

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")

提前感谢您提供的任何提示! 雅各布

3 个答案:

答案 0 :(得分: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位浮点数。也许你的浮子适合它的限制范围。

答案 1 :(得分:2)

numpy.savez_compressed将允许您将大量数组保存到单个压缩的二进制文件中。

然而,你无法将那么压缩它 - 如果你拥有15GB的数据,你就不会通过压缩算法神奇地适应200MB。您必须丢弃一些数据,只有您可以决定需要保留多少数据。

答案 2 :(得分:1)

使用zipfilebz2gzip模块从python保存为zip,bz2或gz文件。您在合理的时间内自己编写的任何压缩方案几乎肯定会比这些通用但优化和编译的解决方案更慢并且压缩率更低。还要考虑接受eumiro的建议。