Numpy分步保存/加载成千上万的数组
我想把大约4000个numpy数组(每个大约1.5MB)存储在一个未压缩的文件里(总共大约6GB的数据)。下面是一个包含两个小数组的例子:
import numpy
d1 = { 'array1' : numpy.array([1,2,3,4]), 'array2': numpy.array([5,4,3,2]) }
numpy.savez('myarrays', **d1)
d2 = numpy.load('myarrays.npz')
for k in d2:
print d2[k]
这个方法可以用,但我想要的效果是不是一步到位:
在保存的时候,我希望能先保存10个数组,然后做一些其他的事情(可能需要几秒钟),接着再写入100个数组,然后再做点别的,最后再写入其他50个数组,依此类推。
在加载的时候也是一样,我希望能先加载一些数组,然后做其他事情,再继续加载。
该怎么用这个 numpy.savez
/ numpy.load
来实现呢?
2 个回答
1
现在的numpy中的savez
其实就是先把数组写入临时文件,使用numpy.save
,然后再把这些文件放到一个压缩包里(可以选择压缩或不压缩)。
如果你不打算压缩文件,那你完全可以省略第二步,直接一个一个地保存你的数组,把所有4000个数组放在同一个文件夹里就行了。
8
我觉得你不能用np.savez来做到这一点。不过,这正是使用hdf5的好机会。你可以看看:
或者
下面是一个如何在h5py中实现这个功能的例子:
h5f = h5py.File('test.h5', 'w')
h5f.create_dataset('array1', data=np.array([1,2,3,4]))
h5f.create_dataset('array2', data=np.array([5,4,3,2]))
h5f.close()
# Now open it back up and read data
h5f = h5py.File('test.h5', 'r')
a = h5f['array1'][:]
b = h5f['array2'][:]
h5f.close()
print a
print b
# [1 2 3 4]
# [5 4 3 2]
当然,还有更复杂的方法可以做到这一点,比如通过组来组织数组,添加元数据,提前在hdf5文件中分配空间,然后再填充数据等等。