如何在python中有效地迭代两个文件?

时间:2013-02-13 12:05:30

标签: python performance file duplicates

我有两个文本文件应该有很多匹配的行,我想知道文件之间到底有多少行匹配。问题是两个文件都很大(一个文件大约3gb,另一个文件大于16GB)。所以很明显使用read()或readlines()将它们读入系统内存可能会有很大问题。有小费吗?我写的代码基本上只是一个2循环和一个if语句来比较它们。

3 个答案:

答案 0 :(得分:2)

由于输入文件非常大,如果您关心性能,则应考虑使用grep -f-f选项从文件中读取模式,因此根据您所使用的确切语义,它可以执行您需要的操作。您可能也想要-x选项,只进行整行匹配。因此,Python中的所有内容可能如下所示:

child = subprocess.Popen(['grep', '-xf', file1, file2], stdout=subprocess.PIPE)
for line in child.stdout:
    print line

答案 1 :(得分:1)

为什么不使用unix grep?如果您希望您的解决方案平台独立,那么此解决方案将无效。但是在unix中它可行。从python脚本运行此命令。

grep --fixed-strings --file=file_B file_A > result_file

此问题似乎也是一个很好的理由去寻找map-reduce。

更新0:要阐明。 --fixed-strings = Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.--file= Obtain patterns from FILE, one per line.

所以我们正在做的是将file_B中的模式与file_A中的内容进行匹配,fixed-strings将它们视为一系列模式,就像它们在文件中一样。希望这更清楚。

由于您希望对匹配行的计数略微修改上述grep,我们得到计数 -

grep --fixed-strings --file=file_B file_A | wc -l

更新1:您可以这样做。首先逐行分别浏览每个文件。不要将整个文件读入内存。当你读取一行计算该行的md5哈希值并将其写入另一个文件时。当你执行这两个文件时,你会得到2个填充了md5哈希值的新文件。我希望这两个文件的大小远小于原始文件,因为md5是16字节而不管i / p字符串。现在你可以做很少或没有内存问题的grep或其他差异技术。 - Srikar 3分钟前编辑

更新2 :(几天后)你能这样做吗?在mysql中创建2个表table1, table2。两者都只有2个字段id, data。逐行将这两个文件插入这两个表中。之后运行查询以查找重复计数。你必须浏览这两个文件。多数民众赞成。我们不能逃避这个事实。现在可以在如何找到重复方面进行优化。 MySQL就是这样一个选择。它删除了许多你需要做的事情,如RAM空间,索引创建等。

答案 2 :(得分:0)

非常感谢您的投入!但我最终做的很简单。我正在尝试这样的事情,它读取整个文件。

file = open(xxx,"r")
for line in file:
      if.....

我最终做的是

for line in open(xxx)
    if.....

第二个逐行获取文件。这是非常耗时的,但我已经非常接受,没有一些神奇的方法可以花很少的时间来做这件事:(