如何将两个以hdf5格式存储的numpy数组连接起来?

3

我有两个存储在hdf5中的numpy数组,每个大小为44 GB。我需要将它们连接在一起,但由于我只有8GB的内存,所以需要在磁盘上进行操作。请问我该如何做呢?

谢谢!


HDF5 对 numpy 一无所知,因此它不是“numpy 数组”。 只需一次读取部分并将它们连接起来即可。[1, 2, 3, 4].concat([5, 6, 7, 8]) 等同于 [1, 2].concat([3, 4]).concat([5, 6]).concat([7, 8]),应该可以分段完成。 - arboreal84
有一个名为 h5py 的模块可以从 hdf5 文件中加载数组。它还可以分块加载。但是,如果您无法同时加载两个文件,则无法将它们连接或将新的更大数组写入文件。 - hpaulj
可能是合并hdf5文件的重复问题。 - MB-F
hpaulj,所以如果我的hdf5文件每个都是44GB,我想将它们合并成一个hdf5文件,在写回hdf5文件之前,我需要88GB的RAM来进行临时合并吗? - user798719
是的,如果你想用 python 做到这一点。我不知道 hdf5 实用程序能做什么(它们是基于 C 或 Fortran 的)。 - hpaulj
2个回答

3

相关的帖子是为了在结果文件中获取不同的数据集。在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]

这样可以部分加载数据集到内存中。


0
你想要扩展的文件必须具有至少一个无限维度和合理的块大小的可扩展变量。然后,您可以轻松地将数据附加到此变量和hdf5文件格式实际上非常适合这样的任务。如果附加不起作用,您可能只需要创建一个新文件,这应该不是问题。以下示例将创建两个文件,然后将第二个文件中的数据合并到第一个文件中。已测试超过80G的文件,内存使用不是问题。
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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接