如何将数组存储在太大而无法加载到内存中的 hdf5 文件中?
How to store an array in hdf5 file which is too big to load in memory?
有什么方法可以将数组存储在 hdf5 文件中,该文件太大而无法加载到内存中?
如果我这样做
f = h5py.File('test.hdf5','w')
f['mydata'] = np.zeros(2**32)
我遇到内存错误。
根据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
returns Numpy 数组。
>>> arr[:10]
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)
>>> type(arr[:10])
numpy.array
您可以为 Numpy 数组设置值。
>>> 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)
有什么方法可以将数组存储在 hdf5 文件中,该文件太大而无法加载到内存中?
如果我这样做
f = h5py.File('test.hdf5','w')
f['mydata'] = np.zeros(2**32)
我遇到内存错误。
根据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
returns Numpy 数组。
>>> arr[:10]
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], dtype=float32)
>>> type(arr[:10])
numpy.array
您可以为 Numpy 数组设置值。
>>> 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)