3

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

1. 只需将 CSV 文件翻译成 Haskell 源文件,如下所示:

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

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

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

那么 TH 是唯一可用的方法吗?或者我可以在源文件中使用硬编码的大数据结构?为什么GHC不能编译文件?它会因为复杂的优化或其他原因而导致组合爆炸吗?

4

1 回答 1

3

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

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

这种方法还有一个额外的好处,那就是在新数据上运行程序会更容易,并且不需要重新编译。

于 2013-10-01T06:15:27.257 回答