在Python中合并具有数百万行的两个表

在Python中合并具有数百万行的两个表,第1张

在Python中合并具有数百万行的两个表

这是一个伪伪鳕鱼,但我认为应该很快。

基于磁盘的直接合并,磁盘上的所有表。关键是您本身并没有做选择,只是通过启动/停止索引到表中,这非常快。

选择满足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)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5617008.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存