2013-02-13 42 views
4

我有兩個文本文件應該有很多匹配行,我想找出文件之間有多少行匹配。問題是這兩個文件都很大(一個文件約3GB,另一個文件大於16GB)。所以很明顯,使用read()或readlines()將它們讀入系統內存可能會造成很大的問題。有小費嗎?我正在寫的代碼基本上只是一個2循環和一個if語句來比較它們。如何在Python中有效地迭代兩個文件?

+1

文件是否排序?如果不是,你可以預先排序嗎? – Johnsyweb 2013-02-13 12:07:48

+0

@ TheFoxx將要匹配的行以相同的順序顯示,其間有更多/更少的行或者是混亂的訂單? – 2013-02-13 12:07:51

+0

打開的文件對象是迭代器;因此您可以調用next()來獲取它們的下一行。使用一些額外的行緩衝區,可以很容易地迭代兩者並找到匹配的行 – 2013-02-13 12:07:55

回答

0

非常感謝您的所有輸入!但是我最終做的事很簡單。我正在嘗試這樣的事情,在整個文件中讀取。

file = open(xxx,"r") 
for line in file: 
     if..... 

我最終什麼事做了

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

由行第二個取文件行。這是非常耗時的,但我幾乎接受,有沒有一些神奇的方式來做到這一點,將需要很少的時間:(

2

由於輸入文件非常大,如果您關心性能,您應該考慮簡單地使用grep -f-f選項從文件讀取模式,因此根據您所使用的確切語義,它可能會執行您所需的操作。您可能也需要-x選項,以便只進行全線匹配。因此,Python中的所有內容可能如下所示:

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

這看起來很有趣,你能解釋一下子變量在做什麼嗎?像subprocess.Popen位? – TheFoxx 2013-02-13 15:57:19

+0

我只是在unix中查找那些文件,然後再次遇到內存問題,必須在程序崩潰前終止進程。 – TheFoxx 2013-02-13 16:21:28

1

爲什麼不使用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_Afixed-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空間,索引創建等。

+0

我實際上已經考慮過使用unix grep,但是我在python中很舒服(但是我真的需要學習更多的unix!)我不太瞭解你的代碼,顯然file_B和file_A是我的文件,但是我不知道沒有固定的琴絃位? – TheFoxx 2013-02-13 15:53:19

+0

好的,這很簡單。既然你說過這兩個文件中的大部分內容都是一樣的。這個命令可以爲你找到。看到我上面的更新。 – 2013-02-13 16:07:28

+0

謝謝。問題再次是內存,運行這個grep幾乎使我的機器崩潰。在它真的讓我的機器崩潰之前,我不得不殺掉它。 – TheFoxx 2013-02-13 16:14:35