gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:30:29 37 4
gpt4 key购买 nike

我有两个大文件。它们的内容如下所示:

134430513
125296589
151963957
125296589

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

现在我想找到两个文件的交集部分。那就是两个文件中都出现的id。

我只是将这两个文件读入 2 组,s1s2。并通过 s1.intersection(s2) 获取交集。但是它消耗大量内存并且看起来很慢。

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

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

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

c1 = id_gen(path)
s1 = set(c1)

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

最佳答案

其他人已经在Python,但是如果数据真的太大了,你可以使用系统实用程序对重复项进行排序和消除,然后使用 File 是一个返回一行的迭代器这一事实一次,做类似的事情:

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

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

关于python - 如何使用 python 有效地找到两个大文件的交集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7331700/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com