haskell - 在 Haskell 中编译大型数据结构

标签 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 在编译时解析文件。

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

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

最佳答案

对如此多的数据进行硬编码并不是常见的用例,因此编译器无法很好地处理它也就不足为奇了。

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

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

关于haskell - 在 Haskell 中编译大型数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19108984/

相关文章:

haskell - Haskell 中缀数据类型构造函数的语法规则

haskell - 如何查找 Haskell 名称的包、版本、文档

haskell - Haskell 中通过 unsafePerformIO 的全局变量

Haskell 宏创建一个从名称到某些表达式的 Map?

haskell - Template Haskell 阶段限制的问题

unit-testing - 从文件系统动态生成 Tasty `TestTree`

haskell - 部分应用程序和子表达式仅取决于函数参数的一个子集

haskell - 查看 Template Haskell 生成的代码的首选方法

haskell - 没有明确的实现警告

haskell - 获取里面的函数名