使用ruby中的多个重复项处理大量数据

时间:2014-03-05 20:11:45

标签: ruby set bigdata

我有一个大文本文件,我想用ruby脚本处理它并存储在一个单独的文件中。我的问题是,生成的文件将包含数亿行,其中绝大多数是重复的。我想在将它们写入磁盘之前消除重复项。

我已经尝试过处理它们并将这些行放在一个集合中,以便在将它们写入输出文件之前消除重复项,但最终我的内存不足并且脚本崩溃了。

有没有办法在ruby中有效地解决我的问题?

2 个答案:

答案 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