如何在hdf5文件中存储一个太大而无法加载到内存中的数组?

时间:2015-03-23 11:39:16

标签: python memory numpy hdf5

有没有办法将数组存储在hdf5文件中,这个文件太大而无法在内存中加载?

如果我这样做

f = h5py.File('test.hdf5','w')
f['mydata'] = np.zeros(2**32)

我收到内存错误。

1 个答案:

答案 0 :(得分:7)

根据documentation,您可以使用create_dataset创建存储在hdf5中的分块数组。例如:

>>> import h5py
>>> f = h5py.File('test.h5', 'w')
>>> arr = f.create_dataset('mydata', (2**32,), chunks=True)
>>> arr
<HDF5 dataset "mydata": shape (4294967296,), type "<f4">

切片HDF5 dataset会返回Numpy-arrays。

>>> arr[:10]
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.], dtype=float32)
>>> type(arr[:10])
numpy.array

您可以为Numpy-array设置值。

>>> arr[3:5] = 3
>>> arr[:6]
array([ 0.,  0.,  0.,  3.,  3.,  0.], dtype=float32)

我不知道这是否是最有效的方法,但您可以在块中迭代整个数组。例如,将其设置为随机值:

>>> import numpy as np
>>> for i in range(0, arr.size, arr.chunks[0]):
        arr[i: i+arr.chunks[0]] = np.random.randn(arr.chunks[0])
>>> arr[:5]
array([ 0.62833798,  0.03631227,  2.00691652, -0.16631022,  0.07727782], dtype=float32)