나는 시계열 Forex csv 데이터 (100MB 이상)를 Ruby 프로그램으로 구문 분석하려고했습니다. 그러나 나는 속도 문제를 다루기가 어렵다.
csv 데이터는 다음과 같습니다. "Date", "Time", "Open", "Close", "High", "Low", "Volume"이 순서대로 포함됩니다.
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를 주석 처리했을 때 훨씬 빨라졌습니다. 나는 Time.now와 Time.new가 빠르다는 것을 알고 있습니다.
누구든지 좋은 아이디어를 가질 수 있습니까? 프로그램이 훨씬 빨라지면 루 비용 C 라이브러리를 만드는 것을 주저하지 않습니다.
감사합니다.
환경
내 프로젝트를 Github에 업로드했습니다. https://github.com/pgkireek/ruby_trade
대신 정규식과 함께 사용할 수있는 것이 있습니다. 모든 그룹을 일치시키고 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
확실하지는 않지만 분할 대신 정규식을 사용하면 훨씬 빠를 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다