2014-03-05 53 views
2

我有一個很大的文本文件,我想用一個ruby腳本處理並存儲在一個單獨的文件中。我的問題是,結果文件將包含數以百萬計的行,其中絕大多數是重複的。我想在將它們寫入磁盤之前消除重複項。在ruby中處理大量數據與多個副本

我已經試過處理它們,並將行放在一個集合中,以便在將它們寫入輸出文件之前消除重複項,但最終我耗盡內存並且腳本崩潰了。

有沒有辦法在ruby中有效解決我的問題?

+0

您的文本文件中的數據是怎樣的?另外,劇本需要多快? –

+0

它是不同長度的英文可讀文本。每行可以有5到500個字符。最好它應該儘可能快:) – user3207230

回答

4

創建一個與此代碼調用uniq.rb文件:

require 'digest' 

hashes = {} 

STDIN.each do |line| 
    line.chomp! 
    md5 = Digest::MD5.digest(line) 
    next if hashes.include?(md5) 
    hashes[md5] = true 
    puts line 
end 

然後在命令行中運行它:

ruby uniq.rb <input.txt> output.txt 

主要的想法是,你不必保存整個行在內存中,而只是一個16字節的MD5散列(加上true的值)來跟蹤獨特的行。

+0

好的解決方案!我正在考慮類似的東西 - 爲每一行創建一個MD5或SHA1哈希,將它存儲在一個哈希表中,等等。我認爲索引就是這樣工作的。 –

+0

謝謝!我會盡快嘗試一下。所以基本上我可以像這樣做:ruby process.rb | ruby uniq.rb> output.txt – user3207230

+0

@ user3207230在合理的假設下是 – Matt

0

如果順序無關緊要,可以使用Unix uniq命令。

ruby process.rb | sort | uniq > out.txt