我有两个文本文件,这两个文件应该有很多匹配的行,我想要精确地找出这两个文件之间有多少行是相同的。问题在于,这两个文件都相当大(一个文件约为3GB,另一个文件超过16GB)。所以,使用read()或readlines()将它们读入系统内存可能会非常棘手。有什么提示吗?我正在编写的代码基本上只使用了2个循环和一个if语句来进行比较。
我有两个文本文件,这两个文件应该有很多匹配的行,我想要精确地找出这两个文件之间有多少行是相同的。问题在于,这两个文件都相当大(一个文件约为3GB,另一个文件超过16GB)。所以,使用read()或readlines()将它们读入系统内存可能会非常棘手。有什么提示吗?我正在编写的代码基本上只使用了2个循环和一个if语句来进行比较。
由于输入文件非常大,如果您关心性能,应该考虑简单地使用grep -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
grep --fixed-strings --file=file_B file_A | wc -l
更新1:你可以这样做。首先逐个文件逐行阅读,不要将整个文件读入内存。当你读取一行时,计算此行的MD5哈希并将其写入另一个文件中。当你对两个文件都这样做时,你会得到两个填充有MD5哈希的新文件。我希望这两个文件在大小上大大减小,因为MD5是16字节,无论输入字符串如何。现在,你可能可以使用grep或其他差异技术进行操作,几乎没有内存问题。 – Srikar 3分钟前编辑
更新2(几天后):你能做到这点吗?在mysql中创建2个表table1, table2
。两个表只有两个字段id、data
。将两个文件逐行插入这两个表中。之后运行一个查询以查找重复项的数量。必须处理两个文件。这是事实。我们不能逃避。现在可以优化如何找到重复项。MySQL就是其中之一。它删除了许多需要进行的操作,例如RAM空间、索引创建等。非常感谢大家的建议!但是我最终做的事情非常简单。我尝试了像这样读取整个文件的方法。
file = open(xxx,"r")
for line in file:
if.....
for line in open(xxx)
if.....