如何以hdf5格式连接两个numpy数组?

时间:2017-05-12 04:40:40

标签: numpy hdf5 h5py

我有两个存储在hdf5中的numpy数组 每个44 GB。我需要将它们连接在一起 但需要在磁盘上进行,因为我只有8GB内存。 我该怎么做?

谢谢!

1 个答案:

答案 0 :(得分: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()