Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Haskell中高效解析大型JSON文件_Json_Parsing_Haskell_Libraries_Lazy Evaluation - Fatal编程技术网

在Haskell中高效解析大型JSON文件

在Haskell中高效解析大型JSON文件,json,parsing,haskell,libraries,lazy-evaluation,Json,Parsing,Haskell,Libraries,Lazy Evaluation,我有一个大的JSON文件(大约90MB),其中包含一个同构的对象数组。 我正在尝试编写一个Haskell程序来减少数组中的值。这似乎是延迟计算的一个很好的候选者——程序不必在处理前一个对象之前读取文件中的每个对象 在使用Data.Aeson和Text.JSON包时,我已经分析了程序的内存使用情况,似乎整个文件都在被解析,一个完整的抽象语法树在一个过程中被构建,然后程序的其余部分才能处理数组。可能是因为解析发生在Maybe(或者要么或Result)monad中,在构建完整的AST之前,不知道解析是

我有一个大的JSON文件(大约90MB),其中包含一个同构的对象数组。 我正在尝试编写一个Haskell程序来减少数组中的值。这似乎是延迟计算的一个很好的候选者——程序不必在处理前一个对象之前读取文件中的每个对象


在使用Data.Aeson和Text.JSON包时,我已经分析了程序的内存使用情况,似乎整个文件都在被解析,一个完整的抽象语法树在一个过程中被构建,然后程序的其余部分才能处理数组。可能是因为解析发生在Maybe(或者要么或Result)monad中,在构建完整的AST之前,不知道解析是否只返回或不返回(或者等价物)。这会导致令人担忧的高内存使用率,并在大多数情况下导致空间溢出

有没有库支持双通道解析?第一次解析确定文件是否可以解析为预期类型,然后第二次延迟解析根据需要读取更多文件


还是有更好的方法来解决这个问题?

据我所知,目前唯一一个针对黑客的流式JSON解析器是。我在过去讨论过创建一个流式JSON解析/呈现库,但我还没有足够的需求(或足够的需求)来这样做。我肯定会支持这样一个库的存在,并且很乐意帮助编写。

使用
conduct
pipes
库来解决这个问题。”可能是因为解析发生在Maybe(或要么或结果)中在构建完整的AST之前,不知道解析是否只返回或不返回(或等价物)。“如果在一个过程中进行折叠,则不应出现这种情况。当这样的事情经常发生时,代码中还有其他东西保留在输入数据上。不过,如果在问题中添加相关的代码位,则更容易判断。这实际上是有道理的。这不是一个显式的折叠,我实际上是在用每个对象的数据更新IOArray,所以现在它实际上是一个mapM。但我刚刚意识到,计算IOArray大小的函数取决于在输入数组中的所有对象中找到一个最大值。也许如果我使用IOVector,这一步可以跳过。感谢您的帮助,很抱歉在一些(可能)琐碎的事情上浪费您的时间。也许您实际上不需要数组和
IO
。您是否尝试过使用
容器
无序容器
中的映射?这可能会使事情变得更简单,特别是如果输出数据与巨大的输入相比相对较小。如果JSON文件的格式为“foo:[项,项,项…]”,那么您基本上只能生成整个AST,因为否则解析器可能会走到最后,遇到错误,因此必须返回错误而不是对象。你能把文件的开头和结尾去掉,把它变成一个JSON对象序列,可以单独解析吗?流媒体库已经编写好了:最后一个版本将在几天内被破解。