我有兩個文本文件應該有很多匹配行,我想找出文件之間有多少行匹配。問題是這兩個文件都很大(一個文件約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. 如何有效地迭代兩個Enumerables的合併?
- 2. 如何有效地迭代Multimap?
- 3. 在Python中迭代兩個文本文件
- 4. 如何使用Python有選擇地迭代文件
- 5. 如何合併兩個python迭代器?
- 6. 如何迭代python中的文件
- 7. 在python中迭代兩個字典
- 8. 如何迭代兩個多地圖並在文件中打印差異?
- 9. Python從字典迭代有兩個值
- 10. Python迭代效率
- 11. 如何同時迭代兩個文件中的行?
- 12. 在迭代列表時如何有效地移除元素?
- 13. 如何有條件地使用Python進行迭代
- 14. 在Python中對文件進行迭代
- 15. 如何在java8中迭代時有效檢查其他條件?
- 16. 在Python中有效地處理一個大的.txt文件
- 17. 在C++中迭代兩張地圖
- 18. 如何在Java中迭代文件?
- 19. 在Python中,如何迭代一個迭代器,然後迭代另一個迭代器?
- 20. 如何減去python中的兩個迭代器
- 21. 如何在Python中有效地重用代碼
- 22. Python:如何迭代文本文件中行中的特定列
- 23. 如何迭代python中的文本文件中的行?
- 24. 有效地迭代嵌套的Python字典
- 25. 使用相同的鍵有效地迭代多個地圖
- 26. 如何迭代xml文件並將其存儲在地圖中
- 27. 如何在Groovy中遞歸地迭代文件?
- 28. 如何在python中並行迭代任意數量的文件?
- 29. 如何在Python中迭代空格分隔的ASCII文件
- 30. 如何有效地跳過python文件中的前n行?
文件是否排序?如果不是,你可以預先排序嗎? – Johnsyweb 2013-02-13 12:07:48
@ TheFoxx將要匹配的行以相同的順序顯示,其間有更多/更少的行或者是混亂的訂單? – 2013-02-13 12:07:51
打開的文件對象是迭代器;因此您可以調用next()來獲取它們的下一行。使用一些額外的行緩衝區,可以很容易地迭代兩者並找到匹配的行 – 2013-02-13 12:07:55