H5py,将匹配的行从巨大的 hdf5 文件合并到较小的数据集

H5py, Merge matched lines from huge hdf5 file to smaller datasets

我有两个巨大的 hdf5 文件,每个文件都有一个 ID 索引,每个文件都包含关于每个 ID 的不同信息。

我已经将一个读入一个小的屏蔽数据集(数据),只使用 select 几个 id。 我现在想添加到数据集,使用来自第二个 hdf5 文件 (s_data).

的一列 ('a') 的那些 select id 的信息

目前我必须阅读整个第二个 hdf5 文件和匹配的 select 个 ID,根据:

for i in range(len(data['ids'])):
        print(i)
        data['a'][i] = s_data['a'][s_data['ids'] == data['ids'][i]]

现在对于 1.9 亿个 ID,这需要很长时间。 这是匹配它们的更简单方法吗?我正在考虑一个 pandas 风格的连接,但是我找不到一种方法让它与 h5py 数据集一起工作。

非常感谢!

你考虑过 PyTables 吗?它是另一个 Python 包来读取 HDF5 文件。它具有基于 OPSI(优化部分排序索引)的快速搜索算法。使用带有搜索条件的 .read_where() 方法将简化搜索过程,并且应该比 h5py 更快。

你的问题与我上周回答的另一个关于查找重复项的问题类似。你可以在这里阅读我的回答:
Pytables duplicates 2.5 giga rows

在搜索之前,我将从 'data' 中的 'ids' 字段中获取一组唯一值,以在 .read_where() 条件中使用以搜索 'sdata'。 如果我了解您的过程和数据,代码将如下所示:

import tables as tb
# need to open HDF5 files  
h5f1 = tb.File('yourfile1.h5','r')
h5f2 = tb.File('yourfile2.h5','r')
# define data and sdata datasets:
data  = h5f1.root.data
sdata = h5f2.root.sdata

# Step 1: Get a Numpy array of the 'ids' field/column from data DS: 
ids_arr = data.read(field='ids')
# Step 2: Get new array with unique values only: 
uids_arr = np.unique(ids_arr)     

#Or, combine steps 1 and 2 into one line: 
uids_arr = np.unique(data.read(field='ids')) 

# Step 3a: Loop on rows of unique id values 
for id_test in uids_arr :

# Step 3b: Get an array with all rows that match this id value, 
#          Only returns values in field 'a' 
     match_row_arr = sdata.read_where('ids==id_test',field='a')