代码之家  ›  专栏  ›  技术社区  ›  Kirill Taran

在Haskell中编译大型数据结构

  •  3
  • Kirill Taran  · 技术社区  · 11 年前

    我有一个有股票交易历史的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不能编译文件?它会因为复杂的优化或其他原因而走向组合爆炸吗?

    1 回复  |  直到 11 年前
        1
  •  3
  •   Tikhon Jelvis    11 年前

    对如此多的数据进行硬编码并不是一种常见的用例,所以编译器处理不好也就不足为奇了。

    一个更好的解决方案是将数据转换成比CSV更容易读取的格式。例如,考虑编写一个程序来解析CSV文件,并使用类似于 cereal 。然后你的主程序可以读取二进制文件,这应该比你的CSV文件快得多。

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