在Haskell中编译大型数据结构

时间:2013-10-01 05:56:17

标签: haskell ghc template-haskell

我有一个包含股票交易历史的CSV文件,其大小为70兆字节。 我想在其上运行我的程序,但不想每次开始等待30秒。

1。  只需将CSV文件转换为Haskell源文件,如下所示:

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

2。  使用Template Haskell来解析文件编译时。

尝试第一种方法我发现在尝试编译一个列表(70 MB源代码)3小时后,我的GHC占用了12GB的内存。

这是单一的可用方法吗?或者我可以在源文件中使用硬编码的大数据结构? 为什么GHC无法编译文件?是否由于复杂的优化或其他因素而导致组合爆炸?

1 个答案:

答案 0 :(得分:3)

硬编码这么多数据并不是一个常见的用例,所以编译器不能很好地处理它也就不足为奇了。

更好的解决方案是将数据放入比CSV更容易阅读的格式。例如,考虑编写一个解析CSV文件的程序,并使用cereal之类的包来序列化生成的结构。然后你的主程序可以读取二进制文件,它应该比你的CSV文件快得多。

这种方法的另一个好处是,在新数据上运行程序会更容易,也不需要重新编译。