在Haskell中有效地解析大型JSON文件

时间:2014-05-12 11:23:55

标签: json parsing haskell libraries lazy-evaluation

我有一个包含同类对象数组的大型JSON文件(大约90MB)。 我正在尝试编写一个减少数组中值的Haskell程序。这似乎是懒惰评估的一个很好的候选者 - 程序不应该从文件中读取每个对象,直到前一个对象被处理完毕。

我在使用Data.Aeson和Text.JSON包时分析了程序的内存使用情况,似乎正在解析整个文件,并且正在构建一个完整的抽象语法树在数组可以由程序的其余部分处理之前传递。可能是因为解析发生在Maybe(或Either或Result)monad中,并且在构建完整的AST之前,解析是否将返回Just或Nothing(或等价物)并不知道。这令人担忧地占用大量内存,并且在大多数情况下会导致空间溢出。

是否有任何库支持双遍解析?第一个解析确定文件是否可以解析为期望的类型,然后是第二个延迟解析,它可以根据需要读取更多文件?

或者有更好的方法来解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

据我所知,Hackage现在唯一的流式JSON解析器是yajl-enumerator。我过去曾讨论过创建一个流式JSON解析/渲染库,但我还没有足够强烈的需求(或足够的需求)这样做。我肯定会赞成这样一个图书馆的存在,并乐意协助写它。