2012-01-31 45 views
1

我有兩個大小爲20Gb的文件。我必須在其中搜索常用字符串。假設字符串的最大長度是20字節。所以爲了解決這個問題,我正在使用以下算法我正在使用一個8GB RAM的系統與四核i3 CPU。在兩個給定的輸入文件中搜索常用字符串

sort the files using any suitable sorting utility 
open files A and B for reading 
read wordA from A 
read wordB from B 
while (A not EOF and B not EOF) 
{ 
    if (wordA < wordB) 
     read wordA from A 
    else if (wordA > wordB) 
     read wordB from B 
    else 
     /* match found, store it into some other files */ 
     write wordA into output 
     read wordA from A 
} 

它去成功地爲上述系統配置,但是當我在6GB內存和6個核i3處理器...我的系統得到了關擊落多次120GB的可用磁盤空間的系統上運行該算法。爲什麼發生這種情況?

PLZ告訴我任何其他方式來解決這個plm!我們可以改善它的表現嗎?

+0

僞代碼並沒有告訴我們您的實現 – 2012-01-31 04:07:18

+0

@Duck「段錯誤出來的?記憶?」我不知道它是如何發生的。實際上,當我用8Gb RAM運行這個時,它使用了大約1.2GB的RAM空間和0%的swape空間,所以我認爲它應該也可以與6Gb RAM一起工作。但它沒有工作,爲什麼? – Gopal 2012-01-31 04:26:05

+0

@MitchWheat是肯定它沒有說執行,那麼我可以如何運行上面的算法與其他系統配置是否還有其他更好的邏輯,可以在任何系統中運行? – Gopal 2012-01-31 04:31:48

回答

3

是的,你可以顯着用很短的awk 1班輪

awk 'FNR==NR{a[$0]++;next}a[$0]' file1 file2 

隨着awk提高性能,你可以找到獨特的線路,而不必首先對它們進行排序。你並沒有真正說出你想用普通線路做什麼,所以我只是假設你想打印出來。

如果你只想打印出一個共同的線一次不管重複多少次,你可以使用這個:

awk 'FNR==NR{a[$0]=1;next}a[$0]-- > 0' file1 file2 
+0

好吧,它似乎很好可以澄清爲什麼,它是多少更好? – Gopal 2012-01-31 04:28:31

+0

@Gopal我提到你不需要預先設定,所以在那裏有兩個完整的運行通過從任務中刪除的文件。只有一個問題你可以回答多好。 – SiegeX 2012-01-31 04:49:15

相關問題