【发布时间】: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