这是一个伪伪鳕鱼,但我认为应该很快。
基于磁盘的直接合并,磁盘上的所有表。关键是您本身并没有做选择,只是通过启动/停止索引到表中,这非常快。
选择满足B中条件的行(使用A的id)不会很快,因为我认为这可能会将数据带入Python空间而不是内核内搜索(我不确定,但是您可能想要在内核优化部分中进一步研究pytables.org。有一种方法可以确定它是否将在内核中。
同样,如果您愿意的话,这是一个非常并行的问题(只是不要将结果从多个进程写入同一文件。pytables对此不安全)。
对于您的merge_a_b *** 作,我认为您可以使用效率很高的标准pandas连接(在内存中)。
另一种选择(取决于A的大小)可能是将A分成两部分(索引相同),并在第一个表中使用较小的(可能使用单列)。而不是存储合并结果本身,而是存储行索引;之后,您可以提取所需的数据(有点像使用索引器并获取数据)。
A = HDFStore('A.h5')B = HDFStore('B.h5')nrows_a = A.get_storer('df').nrowsnrows_b = B.get_storer('df').nrowsa_chunk_size = 1000000b_chunk_size = 1000000def merge_a_b(a,b): # Function that returns an operation on passed # frames, a and b. # It could be a merge, join, concat, or other operation that # results in a single frame.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) # This is your result store m = merge_a_b(a, b) if len(m): store.append('df_result', m)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)