压缩测量数据文件
我从测量中得到的文本文件基本上是一个包含浮点数的表格,尺寸是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 个回答
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位浮点数。也许你的浮点数可以在这个范围内存储。