2013-02-13 55 views
4

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

+1

文件是否排序?如果不是,你可以预先排序吗? – Johnsyweb 2013-02-13 12:07:48

+0

@ TheFoxx将要匹配的行以相同的顺序显示,其间有更多/更少的行或者是混乱的订单? – 2013-02-13 12:07:51

+0

打开的文件对象是迭代器;因此您可以调用next()来获取它们的下一行。使用一些额外的行缓冲区,可以很容易地迭代两者并找到匹配的行 – 2013-02-13 12:07:55

回答

0

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

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

我最终什么事做了

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

由行第二个取文件行。这是非常耗时的,但我几乎接受,有没有一些神奇的方式来做到这一点,将需要很少的时间:(

2

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

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

这看起来很有趣,你能解释一下子变量在做什么吗?像subprocess.Popen位? – TheFoxx 2013-02-13 15:57:19

+0

我只是在unix中查找那些文件,然后再次遇到内存问题,必须在程序崩溃前终止进程。 – TheFoxx 2013-02-13 16:21:28

1

为什么不使用unix grep?如果你想让你的解决方案平台独立,那么这种解决方案将无法工但在unix中它起作用。从你的python脚本运行这个命令。

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

此外这个问题似乎是一个很好的理由去map-reduce。

UPDATE 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所以我们做的AR越来越模式对内容file_Afixed-strings将它们作为匹配模式序列他们是在一个文件的方式。希望这更清楚。

既然你想匹配行上述grep的稍作修改的次数,我们得到的计数 -

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

更新1:你可以这样做。首先逐行逐行浏览每个文件。不要将整个文件读入内存。当你读这行的一行compute md5 hash并将其写入另一个文件时。当你做这两个文件时,你会得到2个新文件,里面填充了md5散列。我希望这两个文件在原始文件的大小上要小得多,因为md5是16字节而与I/P字符串无关。现在你可以做很少或没有内存问题的grep或其他差异技术。 - 斯里卡尔3分钟前编辑

更新2 :(几天后)你能做到这一点吗?在mysql中创建2个表table1, table2。两者都只有2个字段id, data。一行一行地将两个文件插入这两个表中。之后运行查询来查找重复计数。你必须通过这两个文件。给出的。我们无法逃避这一事实。现在优化可以在发现dups的过程中完成。 MySQL就是这样一种选择。它删除了很多你需要做的事情,如RAM空间,索引创建等。

+0

我实际上已经考虑过使用unix grep,但是我在python中很舒服(但是我真的需要学习更多的unix!)我不太了解你的代码,显然file_B和file_A是我的文件,但是我不知道没有固定的琴弦位? – TheFoxx 2013-02-13 15:53:19

+0

好的,这很简单。既然你说过这两个文件中的大部分内容都是一样的。这个命令可以为你找到。看到我上面的更新。 – 2013-02-13 16:07:28

+0

谢谢。问题再次是内存,运行这个grep几乎使我的机器崩溃。在它真的让我的机器崩溃之前,我不得不杀掉它。 – TheFoxx 2013-02-13 16:14:35