我有两个存储在hdf5中的numpy数组,每个大小为44 GB。我需要将它们连接在一起,但由于我只有8GB的内存,所以需要在磁盘上进行操作。请问我该如何做呢?
谢谢!
相关的帖子是为了在结果文件中获取不同的数据集。在Python中,这是可能的,但您需要在多个操作中读取和写入数据集。例如,从文件1读取1GB,写入输出文件,重复此过程直到从文件1读取所有数据,并对文件2执行相同的操作。您需要直接声明适当最终大小的数据集在输出文件中。
d = f.create_dataset('name_of_dataset', shape=shape, dtype=dtype, data=None)
其中shape是从数据集计算出来的,dtype与数据集中的匹配。
要写入d
:
d[i*N:(i+1)N] = d_from_file_1[iN:(i+1)*N]
这样可以部分加载数据集到内存中。
import h5py
import numpy as np
ini_dim1 = 100000
ini_dim2 = 1000
counter = int(ini_dim1/10)
dim_extend = int(ini_dim1/counter)
def create_random_dataset(name, dim1, dim2):
ff1 = h5py.File(name,'w')
ff1.create_dataset('test_var',(ini_dim1,ini_dim2),maxshape=(None,None),chunks=(10,10))
for i in range(counter):
ff1['test_var'][i*dim_extend:(i+1)*dim_extend,:] = np.random.random((dim_extend,ini_dim2))
ff1.flush()
ff1.close()
create_random_dataset('test1.h5', ini_dim1, ini_dim2)
create_random_dataset('test2.h5', ini_dim1, ini_dim2)
## append second to first
ff3 = h5py.File('test2.h5','r')
ff4 = h5py.File('test1.h5','a')
print(ff3['test_var'])
print(ff4['test_var'])
ff4['test_var'].resize((ini_dim1*2,ini_dim2))
print(ff4['test_var'])
for i in range(counter):
ff4['test_var'][ini_dim1+i*dim_extend:ini_dim1 + (i+1)*dim_extend,:] = ff3['test_var'][i*dim_extend:(i+1)*dim_extend,:]
ff4.flush()
ff3.close()
ff4.close()
[1, 2, 3, 4]
.concat([5, 6, 7, 8]
) 等同于[1, 2].concat([3, 4]).concat([5, 6]).concat([7, 8])
,应该可以分段完成。 - arboreal84h5py
的模块可以从 hdf5 文件中加载数组。它还可以分块加载。但是,如果您无法同时加载两个文件,则无法将它们连接或将新的更大数组写入文件。 - hpauljpython
做到这一点。我不知道hdf5
实用程序能做什么(它们是基于 C 或 Fortran 的)。 - hpaulj