这段代码有些类似于伪代码,但我认为应该非常快。
直接使用基于磁盘的合并方式,所有表都在磁盘上。关键是您不是在进行选择,而是通过开始/停止索引到表格中,这非常快速。
使用A的ID选择符合条件的B行将不会非常快,因为我认为它可能会将数据带入Python空间,而不是在内核搜索(我不确定,但您可能希望在pytables.org中更多地研究内核优化部分。有一种方法可以判断它是否会在内核中执行)。
此外,如果您愿意,这是一个非常并行的问题(只是不要从多个进程将结果写入同一个文件。对于此类操作,pytables不安全)。
请参见这个答案,其中有评论说执行join操作实际上将是“inner” join。
对于您的merge_a_b操作,我认为您可以使用标准的pandas join,这很有效(当内存足够时)。
另一个选择(取决于A的大小)可能是将A分成两个部分(其索引相同),在第一个表格中使用较小的索引器(可能只使用单个列);而不是直接存储合并结果,存储行索引;稍后您可以提取所需的数据(有点像使用索引器和take)。请参见http://pandas.pydata.org/pandas-docs/stable/io.html#multiple-table-queries
A = HDFStore('A.h5')
B = HDFStore('B.h5')
nrows_a = A.get_storer('df').nrows
nrows_b = B.get_storer('df').nrows
a_chunk_size = 1000000
b_chunk_size = 1000000
def merge_a_b(a,b):
for a in xrange(int(nrows_a / a_chunk_size) + 1):
a_start_i = a * a_chunk_size
a_stop_i = min((a + 1) * a_chunk_size, nrows_a)
a = A.select('df', start = a_start_i, stop = a_stop_i)
for b in xrange(int(nrows_b / b_chunk_size) + 1):
b_start_i = b * b_chunk_size
b_stop_i = min((b + 1) * b_chunk_size, nrows_b)
b = B.select('df', start = b_start_i, stop = b_stop_i)
m = merge_a_b(a, b)
if len(m):
store.append('df_result', m)