2015-06-27 44 views
4

我有一个巨大的Json文件,我希望避免完全加载到内存中。它的结构非常简单:它由一个内部具有任意元素的大型数组组成。我只想通过随机丢弃大部分元素来转换数组,并简单地输出转换后的Json。我认为这会让Haskell很好的练习(我不是专家,也不了解太多的FP理论)。用Haskell对一个巨大的json数组进行子采样

我发现了pipe-aeson [1]这似乎是我想要的,但经过一段时间后,我不得不承认我卡住了。几乎没有例子,虽然我可以使用Pipes来下采样数据,但使用Parser对象似乎更加复杂。我发现的选项(evalStateT)是严格的,解析整个事情,而不让我介入。

也许透镜将是我的问题的解决方案,但他们非常抽象我不明白他们是什么,也不知道如何使用它们。

有人比我更有见识提供一些指导?

[1] https://hackage.haskell.org/package/pipes-aeson-0.4.1.3/docs/Pipes-Aeson.html#t:DecodingError

回答

3

我相信你将不能够重复使用埃宋本。从aeson Parser documentation

一个JSON值的文字边界的
  • 鉴定:

    如发生在两个阶段它可以想到的解析非常有用。这总是严格的,这样一个无效的JSON文档可以尽快被拒绝。

  • 将JSON值转换为Haskell值。这可能是立即(严格)或延期(懒惰);详情见下文。

的第一颗子弹似乎暗示(对我来说,至少)解析器不会交给你什么,直到它已检查足够的字符串它应该被解析知道解析是成功还是失败 - 就你而言,这几乎可以肯定是整个字符串。因此,这个阶段将把整个对象一次放入内存中(一些表示)。

此属性对于目前大多数解析器组合器库都是如此。您可以考虑查看uu-parsinglib作为替代方案;我相信它支持返回部分解析。有一本非常可读的论文,描述了它从Hackage页面链接的功能。

+0

我找到了一种方法来处理JsonStream和Pipes:https://gist.github.com/joelthelion/7d4d4b44120607b63035。这不是完美的,但它的工作原理。无论如何,感谢您确认Aeson不是正确的工具。 –

相关问题