如何以hdf5格式连接两个numpy阵列?

如何以hdf5格式连接两个numpy阵列?,numpy,hdf5,h5py,Numpy,Hdf5,H5py,我有两个存储在hdf5中的numpy阵列,它们是 每个44 GB。我需要将它们连接在一起 但我需要在磁盘上做,因为我只有8gb的ram。 我该怎么做 谢谢大家! 相关的post是在生成的文件中获取不同的数据集。在Python中,这是可能的,但您需要在多个操作中读取和写入数据集。比如,从文件1读取1GB,写入输出文件,重复操作,直到从文件1读取所有数据,然后对文件2执行相同操作。您需要直接在输出文件中声明相应最终大小的数据集 d = f.create_dataset('name_of_datase

我有两个存储在hdf5中的numpy阵列,它们是 每个44 GB。我需要将它们连接在一起 但我需要在磁盘上做,因为我只有8gb的ram。 我该怎么做


谢谢大家!

相关的post是在生成的文件中获取不同的数据集。在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_来自_文件_1[iN:(i+1)*N]


这只能部分加载内存中的数据集。

要扩展的文件必须具有至少一个无限制维度和合理块大小的可扩展变量。然后,您可以很容易地将数据附加到此变量,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()

HDF5对numpy一无所知,所以它不是“numpy阵列”。只需一次读取其中的一部分并将其连接起来<代码>[1,2,3,4].concat(
[5,6,7,8]
)与
[1,2]相同。concat([3,4])。concat([5,6])。concat([7,8])
,应该能够部分完成。有一个
h5py
模块可以从hdf5文件加载阵列。它可以分块加载。但如果无法加载两个文件,则无法将它们连接起来或将新的较大数组写入该文件。hpaulj可能重复,因此如果我的hdf5文件每个为44 gb,并且我希望将它们合并到一个hdf5文件中,则在回写到hdf5文件之前,我将需要临时合并88 gb的ram?是,如果您想使用
python
。我不知道使用
hdf5
实用程序(基于C或Fortran)可以做什么。