ruby-on-rails - 如何加快我的 Ruby/Rake 任务,该任务计算 300K 日期字符串中日期的出现次数?

标签 ruby-on-rails ruby performance optimization rake

我有一个代表日期的 300K 字符串数组:

date_array = [
  "2007-03-25 14:24:29",
  "2007-03-25 14:27:00",
  ...
]

我需要计算此数组中每个日期的出现次数(例如,“2011-03-25”的所有日期字符串)。确切的时间并不重要——重要的是日期。我知道文件中的日期范围。所以我有:

Date.parse('2007-03-23').upto Date.parse('2011-10-06') do |date_to_count|
  count = 0
  date_array.each do |date_string|
    if Date.parse(date_string) >= date_to_count && 
       Date.parse(date_string) <= date_to_count
      count += 1
    end
  end
  puts "#{date_to_count} occurred #{count} times."
end

在我的机器上计算一个日期的出现时间超过 60 秒。我可以通过哪些方式优化此任务的性能?

可能有用的注释:我使用的是 Ruby 1.9.2。此脚本在 rake 0.9.2 的 Rake 任务中运行。 date_array 从 CSV 文件加载。在每次迭代中,count 都作为记录保存在我的 Rails 项目数据库中。

最佳答案

是的,如果日期格式相同,则根本不需要解析日期。了解您的数据是您可以拥有的最强大的工具之一。

如果日期时间字符串都采用相同的格式 (yyyy-mm-dd HH:MM:SS),那么您可以执行类似的操作

data_array.group_by{|datetime| datetime[0..9]}

这将为您提供一个散列,例如以日期字符串作为键,以日期数组作为值

{
  "2007-05-06" => [...],
  "2007-05-07" => [...],
  ...
}

所以你必须得到每个数组的长度

data_array.group_by{|datetime| datatime[0..9]}.each do |date_string, date_array|
  puts "#{date_string} occurred #{date_array.length} times."
end

当然,当您不需要日期数组时,该方法会浪费内存。

那怎么样

更节省内存的方法

date_counts = {}
date_array.each do |date_string|
  date = date_string[0..9]
  date_counts[date] ||= 0 # initialize count if necessary
  date_counts[date] += 1
end

您最终会得到一个以日期字符串为键、以计数为值的散列

{
  "2007-05-06" => 123,
  "2007-05-07" => 456,
  ...
}

将一切放在一起

date_counts = {}
date_array.each do |date_string|
  date = date_string[0..9]
  date_counts[date] ||= 0 # initialize count if necessary
  date_counts[date] += 1
end

Date.parse('2007-03-23').upto Date.parse('2011-10-06') do |date_to_count|
  puts "#{date_to_count} occurred #{date_counts[date_to_count.to_s].to_i} times."
end

关于ruby-on-rails - 如何加快我的 Ruby/Rake 任务,该任务计算 300K 日期字符串中日期的出现次数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7689731/

相关文章:

java - 是否有任何基准比较 Java 8 Streams 和 Guava Iterables?

node.js - 我如何为 npm 安装计时?

ruby-on-rails - 设置 session 变量

ruby-on-rails - 无法获取在 Rails 4 中删除可评论注释的语法

mysql - 如何使用 rails 将 excel 文件导入 mysql?

ruby - 链接到 ruby​​ 中的外部文件?

ruby - 如何使用 Ruby 删除回车而不用 "-"或空格替换它

python - MySQL Python 查询大型数据库的时间太长

ruby-on-rails - 在 Rails Router 中获取异常内容

ruby-on-rails - Heroku 不重置数据库