Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python中高效地迭代两个文件?_Python_Performance_File_Duplicates - Fatal编程技术网

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

如何在python中高效地迭代两个文件?,python,performance,file,duplicates,Python,Performance,File,Duplicates,我有两个文本文件,应该有很多匹配的行,我想知道文件之间到底有多少行匹配。问题是这两个文件都相当大(一个文件大约3gb,另一个超过16gb)。因此,显然,使用read()或readlines()将它们读入系统内存可能会有很大的问题。有什么建议吗?我编写的代码基本上是一个2个循环和一个if语句来比较它们。因为输入文件非常大,如果你关心性能,你应该简单地考虑使用 GRIP-F。-f选项从文件中读取模式,因此根据您所追求的确切语义,它可能会执行您需要的操作。您可能也希望-x选项只进行整行匹配。因此,Py

我有两个文本文件,应该有很多匹配的行,我想知道文件之间到底有多少行匹配。问题是这两个文件都相当大(一个文件大约3gb,另一个超过16gb)。因此,显然,使用read()或readlines()将它们读入系统内存可能会有很大的问题。有什么建议吗?我编写的代码基本上是一个2个循环和一个if语句来比较它们。

因为输入文件非常大,如果你关心性能,你应该简单地考虑使用<代码> GRIP-F。
-f
选项从文件中读取模式,因此根据您所追求的确切语义,它可能会执行您需要的操作。您可能也希望
-x
选项只进行整行匹配。因此,Python中的整个内容可能如下所示:

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

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

grep --fixed-strings --file=file_B file_A > result_file
此外,这个问题似乎是一个很好的理由去地图减少

更新0:以澄清
--fixed strings=将模式解释为固定字符串列表,由新行分隔,其中任何一行都要匹配。
--file=从文件中获取模式,每行一个。

因此,我们要做的是从
file\u B
中获取与
file\u A
中的内容相匹配的模式,
fixed string
将它们视为一系列模式,就像它们在文件中一样。希望这能让事情更清楚

由于您希望对上述
grep
进行轻微修改,从而获得匹配行的计数-

grep --fixed-strings --file=file_B file_A | wc -l
更新1:您可以这样做。首先逐行分别检查每个文件。不要将整个文件读入内存。当您读取一行时,计算此行的md5哈希并将其写入另一个文件。当您同时对两个文件执行此操作时,您将得到两个新文件,其中填充了md5哈希。我希望这两个文件的大小比原始文件小很多,因为不管I/p字符串如何,md5都是16字节。现在,你可能可以在几乎没有或根本没有内存问题的情况下使用grep或其他扩散技术斯里卡尔3分钟前编辑


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

非常感谢大家的输入!但我最终所做的事情非常简单。我试过这样的方法,可以读取整个文件

file = open(xxx,"r")
for line in file:
      if.....
我最后做的是

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

第二个是逐行获取文件。这非常耗时,但我几乎接受了这样一个事实:没有什么神奇的方法可以花费很少的时间:(

文件是否已排序?如果未排序,是否可以对其进行预排序?@TheFoxx要匹配的行是否会以相同的顺序显示,中间有更多/更少的行,或者顺序是否混乱?打开的文件对象是迭代器;因此您可以调用
next()
对它们进行排序,以获得下一行。使用一些额外的行缓冲区,应该可以很容易地对这两行进行迭代并找到匹配的行。被排序的文件并不特别重要,即使在排序时,小文件中相邻的两行在大文件中也可以被数百万行文本隔开。@TheFoxx:The人们询问排序的原因是,如果对两个文件进行了排序,那么在任何给定的时间,您只需要在内存中保留每个文件的一行。分隔连续匹配的潜在“数百万行”是不相关的。我实际上考虑过使用unix grep,但我对python非常熟悉(但我确实需要学习更多unix!)我不太理解你的代码,显然file_B和file_A是我的文件,但我没有固定的字符串位?好的,这很简单。因为你说这两个文件中的大多数内容都是相同的。这个命令为你找到了这个。请看我上面的更新。谢谢。问题再次是内存,运行这个grep几乎使我的机器崩溃。我在它真的使我的机器崩溃之前杀掉它。你能这样做吗?首先逐行分别检查每个文件。不要将整个文件读入内存。当你读取一行时,计算此行的md5哈希并将其写入另一个文件。当你同时执行这两个文件时,你会得到两个新文件,其中填充了md5哈希。我希望这两个文件由于md5是16字节,与i/p字符串无关,所以s的大小比原始文件小得多。现在你可能可以在几乎没有内存问题的情况下使用grep或其他扩散技术。现在有一个非常好的主意。它仍然只是比较两行,对吗?我会试试看这看起来很有趣,你能解释一下c是什么吗hild变量正在做什么?就像subprocess.Popen位一样??我只是在unix中对那里的文件进行了grepping,我再次遇到内存问题,不得不在进程崩溃之前杀死它。