json - 使用 Haskell 对巨大的 json 数组进行子采样

标签 json haskell haskell-pipes

我有一个巨大的 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

最佳答案

我相信您将无法为此重复使用 aeson。来自 aeson Parser documentation :

It can be useful to think of parsing as occurring in two phases:

  • Identification of the textual boundaries of a JSON value. This is always strict, so that an invalid JSON document can be rejected as soon as possible.
  • Conversion of a JSON value to a Haskell value. This may be either immediate (strict) or deferred (lazy); see below for details.


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

此属性适用于目前大多数解析器组合器库。你可以考虑看看uu-parsinglib作为备选;我相信它支持返回部分解析。有一篇非常易读的论文描述了从其 Hackage 页面链接的功能。

关于json - 使用 Haskell 对巨大的 json 数组进行子采样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31090783/

相关文章:

json - 在 ASP.Net MVC 中设置 Access-Control-Allow-Origin - 最简单的方法

json - 在 OpenLayers 中保存和恢复几何图形

haskell - 欧拉计划 : A (much) better way to solve problem #5?

haskell-pipes - 使用 haskell 管道字节串逐行迭代文件

haskell - Iteratees和FRP之间有什么联系?

json - 如何将json数据追加到文件中?

haskell - 如何在 Haskell 中组合单子(monad)?

haskell - 使用 Haskell 修改数字类型

haskell - ProxyFast/ProxyCorrect 的 MonadTransControl 实例

javascript - 如何使用 d3.js 访问 JSON