我有一個很大的文本文件,我想用一個ruby腳本處理並存儲在一個單獨的文件中。我的問題是,結果文件將包含數以百萬計的行,其中絕大多數是重複的。我想在將它們寫入磁盤之前消除重複項。在ruby中處理大量數據與多個副本
我已經試過處理它們,並將行放在一個集合中,以便在將它們寫入輸出文件之前消除重複項,但最終我耗盡內存並且腳本崩潰了。
有沒有辦法在ruby中有效解決我的問題?
我有一個很大的文本文件,我想用一個ruby腳本處理並存儲在一個單獨的文件中。我的問題是,結果文件將包含數以百萬計的行,其中絕大多數是重複的。我想在將它們寫入磁盤之前消除重複項。在ruby中處理大量數據與多個副本
我已經試過處理它們,並將行放在一個集合中,以便在將它們寫入輸出文件之前消除重複項,但最終我耗盡內存並且腳本崩潰了。
有沒有辦法在ruby中有效解決我的問題?
創建一個與此代碼調用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
的值)來跟蹤獨特的行。
好的解決方案!我正在考慮類似的東西 - 爲每一行創建一個MD5或SHA1哈希,將它存儲在一個哈希表中,等等。我認爲索引就是這樣工作的。 –
謝謝!我會盡快嘗試一下。所以基本上我可以像這樣做:ruby process.rb | ruby uniq.rb> output.txt – user3207230
@ user3207230在合理的假設下是 – Matt
如果順序無關緊要,可以使用Unix uniq
命令。
ruby process.rb | sort | uniq > out.txt
您的文本文件中的數據是怎樣的?另外,劇本需要多快? –
它是不同長度的英文可讀文本。每行可以有5到500個字符。最好它應該儘可能快:) – user3207230