我有两个大文件。它们的内容如下所示:
134430513
125296589
151963957
125296589
该文件包含未排序的 id 列表。某些 id 可能会在单个文件中出现多次。
现在我想找到路口两个文件的一部分。这就是两个文件中都出现的 id。
我只是将这两个文件读成2组,s1
and s2
。并通过以下方式获得交集s1.intersection(s2)
。但它消耗大量内存并且看起来很慢。
那么有没有更好的或Python式的方法来做到这一点?如果文件包含太多无法读入的 idset
内存有限,我能做什么?
编辑:我使用生成器将文件读入两组:
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 可以做到,因为它针对这一任务进行了优化)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)