【问题标题】:The fastest way to read csv data to Time class in Ruby在 Ruby 中将 csv 数据读取到 Time 类的最快方法
【发布时间】:2014-02-16 02:08:52
【问题描述】:

我一直在尝试将时间序列外汇 csv 数据(超过 100MB)解析为 Ruby 程序。 但我面临着处理速度问题的困难。

csv 数据如下所示。 它依次包含“日期”、“时间”、“打开”、“关闭”、“高”、“低”、“音量”。

2007.01.02,07:00,119.01,119.01,119.01,119.01,8
2007.01.02,07:01,119.01,119.01,119.01,119.01,8
2007.01.02,07:02,119.01,119.01,119.01,119.01,8
2007.01.02,07:03,119.01,119.02,119.01,119.02,8
2007.01.02,07:04,119.02,119.03,119.01,119.02,8

我写了一个脚本来导入它。 我避免使用 CSV 库,因为解析 CSV 文件太慢了。 (如 CSV.parse CSV.foreach)

IO.foreach(csv) do |line|
  res = line.split(",")
  Time.parse("%s %s"%[res[0], res[1]])
  res[2].to_f
  res[3].to_f
  res[4].to_f
  res[5].to_f
  res[6].to_i
end

当我执行这个程序时,Time.parse 太慢了。 csv文件有250万行,所以要经历250万次。

对比结果如下。

  • 使用 Time.parse:160 秒。
  • 使用 Time.local:56 秒。 (修改后的 csv 数据)
  • Time.at : 23 秒。 (修改后的 csv 数据)
  • 无时间解析:仅需 10 秒。

当我注释掉 Time.parse 时,它​​变得更快了。 我知道没有参数的 Time.now 和 Time.new 很快。

谁能有一个好主意? 如果它使程序更快,我会毫不犹豫地为 Ruby 制作 C 库。

谢谢。

环境

  • Windows 7 x64
  • ruby 2.0.0p247 (2013-06-27) [i386-mingw32]

我将我的项目上传到 Github。 https://github.com/pgkireek/ruby_trade

【问题讨论】:

  • 您可以考虑使用数据库而不是 csv。或者你必须解析某处生成的 csv……因为它与交易有关。
  • 我已经用内存中的 sqlite3 制作了大多数程序,但是速度还不够快。所以我正在尝试直接读取文件以确认它是否可以使其更快。
  • 尝试使用 Time.new(2007,5,5,7,00) 但您必须先将 res[0] 和 res[1] 转换为整数,或者如果 csv 可以通过这些从一开始就是整数
  • 谢谢。 Time.new 需要 57 秒。 Time.at 需要 23 秒。目前 Time.at 是最快的。我更新了这篇文章,因为结果信息是错误的。对不起。

标签: ruby performance csv


【解决方案1】:

这是您可以使用正则表达式的东西。匹配所有组并在Time.new中使用。

IO.foreach(csv) do |line|
    res = line.scan /((\d+)\.(\d+)\.(\d+)|(\d+):(\d+)|(\d+)\.(\d+)|\d+)/
    puts Time.new res[0][1], res[0][2], res[0][3], res[1][4], res[1][5]

    puts res[2][0].to_f
    puts res[3][0].to_f
    puts res[4][0].to_f
    puts res[5][0].to_f
    puts res[6][0].to_i
end

不确定,但使用正则表达式而不是拆分可能会快得多。

【讨论】:

  • 谢谢。它比 Time.parse 更好。
  • 你能告诉我 OP 的意思吗,通过执行 to_fto_i,因为这些条目已经是 float 和 fixnum,在那个位置?
  • @ArupRakshit 它们是字符串,您必须在需要时将它们转换为 int/float。
猜你喜欢
  • 2011-05-21
  • 2014-09-26
  • 2012-05-17
  • 1970-01-01
  • 2014-03-13
  • 2014-10-04
  • 2019-07-31
  • 1970-01-01
  • 2013-08-19
相关资源
最近更新 更多