我有两个文本文件应该有很多匹配行,我想找出文件之间有多少行匹配。问题是这两个文件都很大(一个文件约3GB,另一个文件大于16GB)。所以很明显,使用read()或readlines()将它们读入系统内存可能会造成很大的问题。有小费吗?我正在写的代码基本上只是一个2循环和一个if语句来比较它们。如何在Python中有效地迭代两个文件?
回答
非常感谢您的所有输入!但是我最终做的事很简单。我正在尝试这样的事情,在整个文件中读取。
file = open(xxx,"r")
for line in file:
if.....
我最终什么事做了
for line in open(xxx)
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
此外这个问题似乎是一个很好的理由去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_A
和fixed-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空间,索引创建等。
- 1. 如何使用Python有选择地迭代文件
- 2. 如何合并两个python迭代器?
- 3. 如何迭代python中的文件
- 4. 在python中迭代两个字典
- 5. Python迭代效率
- 6. 如何同时迭代两个文件中的行?
- 7. 如何有条件地使用Python进行迭代
- 8. 在C++中迭代两张地图
- 9. 如何在Java中迭代文件?
- 10. 如何减去python中的两个迭代器
- 11. 如何在Python中有效地重用代码
- 12. 如何迭代python中的文本文件中的行?
- 13. 如何在Groovy中递归地迭代文件?
- 14. 在Python中使用两个迭代器进行Mergesort风格的迭代
- 15. 在插入其他线程时有效地迭代地图
- 16. 如何迭代tMongoDBBulkLoad文件
- 17. 如何迭代XML文件
- 18. 如何干净地遍历两个文件并行在Python
- 19. 如何在Python中迭代字典?
- 20. 如何在Python中迭代JSON列表?
- 21. 如何在Python中使用lambda迭代
- 22. 如何在python中迭代列表中的两个连续元素?
- 23. 如何在Python中最小化时正确地停止迭代?
- 24. 通过一个巨大的循环迭代有效地使用python
- 25. Python:如何迭代基于文件名的文件集?
- 26. 迭代中的多个条件,Python
- 27. 如何(优雅地)一次迭代两个列表?
- 28. 如何结合两个@objects的迭代?
- 29. 如何并行迭代两个列表?
- 30. 如何高效地逐项比较两个大的XML文件?
文件是否排序?如果不是,你可以预先排序吗? – Johnsyweb 2013-02-13 12:07:48
@ TheFoxx将要匹配的行以相同的顺序显示,其间有更多/更少的行或者是混乱的订单? – 2013-02-13 12:07:51
打开的文件对象是迭代器;因此您可以调用next()来获取它们的下一行。使用一些额外的行缓冲区,可以很容易地迭代两者并找到匹配的行 – 2013-02-13 12:07:55