2013-10-01 88 views
3

我有一個包含股票交易歷史的CSV文件,其大小爲70兆字節。 我想在其上運行我的程序,但不想每次啓動都要等待30秒。編譯Haskell中的大數據結構

1. 只是翻譯成CSV文件Haskell的源文件是這樣的:

From      | TO 
------------------------------------------- 
1380567537,122.166,2.30243 | history = [ 
...      |  (1380567537,122.166,2.30243) 
...      |  , ... 
...      |  ] 

2. 使用模板哈斯克爾解析文件編譯時。

嘗試第一種方法我發現我的GHC在嘗試編譯一個列表(70 mb源代碼)3小時後吃了12GB的內存。

那麼TH是單一的可用方法?或者我可以在源文件中使用硬編碼的大數據結構? 爲什麼GHC不能編譯文件?由於複雜的優化或其他原因,是否會發生組合爆炸?

+1

使用像bytestring和attoparsec這樣的快速庫會將時間減少到小於30秒。 – Satvik

+0

http://stackoverflow.com/a/6403503/83805 –

+0

可能的重複你試過[木薯](http://blog.johantibell.com/2012/08/a-new-fast-and-easy-to -use-CSV-library.html)? – jtobin

回答

3

對這麼多數據進行硬編碼並不是一種常見的用例,因此編譯器無法很好地處理它並不奇怪。

更好的解決方案是將數據轉換爲比CSV容易閱讀的格式。例如,考慮編寫一個解析CSV文件的程序,並使用一些包如cereal的程序包對結果結構進行序列化。然後你的主程序就可以讀取二進制文件,它應該比你的CSV文件快得多。

此方法還有一個額外的好處,即在新數據上運行程序會更容易,不需要重新編譯。

+0

我假設內置程序數據會提供更多的性能。 這是真的還是提升不會很顯着? 無論如何,不​​錯的提示。我沒有回想起這種可能性。 –

+0

我真的懷疑性能差異是否顯着。但是,我不完全確定 - 我必須運行基準測試或其他測試。不過,更重要的是,我認爲穀物方法很快*足夠用於您的目的,而且聽起來更容易實施。這就是我想先嚐試的。 –

+1

以下是我的基準測試:http://jsbin.com/ucIbIgu(CSV代表MissingH軟件包中的Data.CSV)。序列化非常快。 –