我有一个大文本文件,我想用ruby脚本处理它并存储在一个单独的文件中。我的问题是,生成的文件将包含数亿行,其中绝大多数是重复的。我想在将它们写入磁盘之前消除重复项。
我已经尝试过处理它们并将这些行放在一个集合中,以便在将它们写入输出文件之前消除重复项,但最终我的内存不足并且脚本崩溃了。
有没有办法在ruby中有效地解决我的问题?
答案 0 :(得分: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
值)来跟踪唯一的行。
答案 1 :(得分:0)
如果顺序无关紧要,可以使用Unix uniq
命令。
ruby process.rb | sort | uniq > out.txt