我有两个文本文件应该有很多匹配的行,我想知道文件之间到底有多少行匹配。问题是两个文件都很大(一个文件大约3gb,另一个文件大于16GB)。所以很明显使用read()或readlines()将它们读入系统内存可能会有很大问题。有小费吗?我写的代码基本上只是一个2循环和一个if语句来比较它们。
答案 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.....
第二个逐行获取文件。这是非常耗时的,但我已经非常接受,没有一些神奇的方法可以花很少的时间来做这件事:(