如何使用python有效地找到两个大文件的交集?

ama*_*jxq 5 python algorithm set

我有两个大文件.他们的内容如下:

134430513
125296589
151963957
125296589

该文件包含未排序的ID列表.某些ID可能会在单个文件中出现多次.

现在我想找到两个文件的交集部分.这就是两个文件中出现的ID.

我刚把这两个文件读成2套,s1并且s2.并获得交叉点s1.intersection(s2).但它消耗大量内存并且看起来很慢.

那么有没有更好的或pythonic方式来做到这一点?如果文件中包含许多无法读入set内存有限的ID,我该怎么办?

编辑:我使用生成器将文件读入2组:

def id_gen(path):
    for line in open(path):
        tmp = line.split()
        yield int(tmp[0])

c1 = id_gen(path)
s1 = set(c1)
Run Code Online (Sandbox Code Playgroud)

所有id都是数字的.并且最大id可能是5000000000.如果使用bitarray,它将消耗更多内存.

Jam*_*nze 6

其他人已经展示了在 Python 中执行此操作的更惯用的方法,但如果数据的大小确实太大,您可以使用系统实用程序来排序和消除重复项,然后使用 File 是一个返回 1 的迭代器这一事实一次一行,执行以下操作:

import os
os.system('sort -u -n s1.num > s1.ns')
os.system('sort -u -n s2.num > s2.ns')
i1 = open('s1.ns', 'r')
i2 = open('s2.ns', 'r')
try:
    d1 = i1.next()
    d2 = i2.next()
    while True:
        if (d1 < d2):
            d1 = i1.next()
        elif (d2 < d1):
            d2 = i2.next()
        else:
            print d1,
            d1 = i1.next()
            d2 = i2.next()
except StopIteration:
    pass
Run Code Online (Sandbox Code Playgroud)

这避免了内存中一次(对于每个文件)有多于一行(并且系统排序应该比 Python 可以做的任何事情都快,因为它针对这一任务进行了优化)。