2014-02-16 32 views
0

我一直在試圖將時間序列外匯csv數據(超過100MB)解析爲Ruby程序。 但我正面臨着解決速度問題的難題。將csv數據讀取到Ruby中Time類的最快方法

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萬次。

比較結果如下。

  • With Time.parse:160 seconds。
  • With Time.local:56秒。 (修改的csv數據)
  • With Time.at:23秒。 (修改後的csv數據)
  • 沒有時間分析:只有10秒。

當我註釋掉Time.parse時,它變得更快了。 我知道Time.now和Time.new沒有參數很快。

任何人都可以有一個好主意嗎? 如果使程序更快,我會毫不猶豫地爲Ruby創建C庫。

謝謝。

環境

  • Windows 7的64位
  • 紅寶石2.0.0p247(2013年6月27日)[I386-的mingw32]

我上傳我的項目Github上。 https://github.com/pgkireek/ruby_trade

+0

您能否考慮使用數據庫而不是csv。或者你必須解析生成的csv ...因爲它涉及到交易。 –

+0

我已經使用內存中的sqlite3編寫了大部分程序,但速度不夠快。所以我正在嘗試直接讀取文件以確認它是否可以使其更快。 –

+0

嘗試使用Time.new(2007,5,5,7,00),但必須首先將res [0]和res [1]轉換爲整數,或者如果csv可以從頭開始將整數轉換爲整數 – sonnyhe2002

回答

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 

不確定,但它可以更快地使用正則表達式而不是拆分。

+0

謝謝。它比Time.parse更好。 –

+0

你可以通過執行'to_f'和'to_i'來告訴我OP的意思嗎?在那些位置上,那些條目已經是float和fixnum了? –

+0

@ArupRakshit它們是字符串,必要時必須將它們轉換爲int/float。 –

相關問題