【问题标题】:Compiling large data structures in Haskell在 Haskell 中编译大型数据结构
【发布时间】:2013-10-01 05:56:16
【问题描述】:

我有一个包含股票交易历史的 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不能编译文件?是不是因为复杂的优化什么的而导致组合爆炸?

【问题讨论】:

  • 使用 bytestring 和 attoparsec 等快速库将时间缩短到 30 秒以内。
  • 你试过cassava吗?
  • 唐,是的,它是相关的,但是关于这个问题的答案是关于将字节串文字插入代码然后将其转换为结构;但我想在我的程序中获得已经编译的结构。
  • jtobin,问题不在于它,但我会尝试一下。还是谢谢你。

标签: haskell ghc template-haskell


【解决方案1】:

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

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

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

【讨论】:

  • 我认为内置程序数据会提供更高的性能。这是真的还是提升不会很重要?无论如何,不​​错的提示。我不记得有这种可能性。
  • 我真的怀疑性能差异是否显着。但是,我并不完全确定——我必须运行基准测试或其他东西。不过,更重要的是,我认为谷物方法非常很可能对您的目的来说足够,而且听起来更容易实现。这是我首先要尝试的。
  • 这是我的基准测试:jsbin.com/ucIbIgu(CSV 代表来自 MissingH 包的 Data.CSV)。序列化速度非常快。
猜你喜欢
  • 2013-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
相关资源
最近更新 更多