Ruby的Histogram / Aggregator优化实现

时间:2014-04-01 15:05:34

标签: ruby histogram aggregator

我即将自己编写,但我想知道是否有任何可用作聚合器/直方图的宝石/库

我的目标是根据匹配的键总结值:

["fish","2"]
["fish","40"]
["meat","56"]
["meat","1"]

应该对每个唯一键的值进行求和并返回["fish","42"]["meat","57"] 我必须聚合的文件相对较大,大约4GB的文本文件由tsv键/值对组成 我的目标是尽量不使用临时文件,以免在机器上占用太多空间,所以我想知道是否已经存在类似已经优化的东西,我在github上发现了一个名为'histogram'的jeb但它没有真的包含我需要的功能 THX

1 个答案:

答案 0 :(得分:1)

你可以使用默认值为0的Hash进行计数,最后你可以将它转换为Array以产生你想要的格式,不过我认为你可能只想继续使用Hash。

data = [
  ["fish","2"],
  ["fish","40"],
  ["meat","56"],
  ["meat","1"]
]

hist = data.each_with_object(Hash.new(0)) do |(k,v), h|
  h[k] += v.to_i
end

hist # => {"fish"=>42, "meat"=>57}
hist.to_a # => [["fish", 42], ["meat", 57]]
# To get String values, "42" instead of 42, etc:
hist.map { |k,v| [k, v.to_s] } # => [["fish", "42"], ["meat", "57"]]

由于您声明必须从文件中读取数据,因此以上是应用于文件时的上述内容。此示例的input.txt文件内容如下:

fish,2
fish,40
meat,56
meat,1

然后,通过逐行读取来创建与以前相同的输出:

file = File.open('input.txt')

hist = file.each_with_object(Hash.new(0)) do |line, h|      
  key, value = line.split(',')
  h[key] += value.to_i
end

file.close
相关问题