4

我有一个巨大的 Json 文件,我想避免完全加载到内存中。它的结构非常简单:它由一个包含任意元素的大数组组成。我只是想通过随机删除大部分元素来转换数组,并简单地输出转换后的 Json。

Haskell 似乎很适合这个懒惰的问题,我认为它会是一个很好的 Haskell 练习(我不是专家,我不太了解 FP 理论)。

我发现 pipe-aeson [1] 这似乎是我想要的,但在尝试了一段时间后,我不得不承认我被卡住了。几乎没有示例,虽然我可以使用 Pipes 对数据进行下采样,但使用 Parser 对象似乎更复杂。我发现的选项 (evalStateT) 是严格的,并且会解析整个事情,而不会让我干预。

也许镜头可以解决我的问题,但它们非常抽象,我不知道它们是什么,也不知道如何使用它们。

比我更有知识的人可以提供一些指导吗?

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

4

1 回答 1

3

我相信您将无法为此重用aeson。从aesonParser文档中:

将解析分为两个阶段可能会很有用:

  • 识别 JSON 值的文本边界。这始终是严格的,以便可以尽快拒绝无效的 JSON 文档。
  • 将 JSON 值转换为 Haskell 值。这可以是立即的(严格的)或延迟的(懒惰的);详情见下文。

第一个项目符号似乎暗示(至少对我来说)解析器不会给你任何东西,直到它检查了足够的应该解析的字符串以知道解析是成功还是失败——在你的情况下,这几乎是当然是整个字符串。因此,此阶段将立即将整个对象(某种表示形式)放入内存中。

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

于 2015-06-27T22:48:26.723 回答