4

完全にメモリにロードすることを避けたい巨大な Json ファイルがあります。その構造は非常に単純です。内部に任意の要素を持つ大きな配列で構成されています。ほとんどの要素をランダムにドロップし、変換された Json を出力するだけで配列を変換したいと思います。

Haskell は、すべての怠惰なこの問題に適しているようで、Haskell の優れた演習になると思いました (私は専門家ではなく、FP 理論もあまり知りません)。

pipes-aeson [1] を見つけました。例はほとんどなく、Pipe を使用してデータをダウンサンプリングすることはできますが、Parser オブジェクトを使用するのはより複雑に思えます。私が見つけたオプション (evalStateT) は厳密で、私が介入することなく全体を解析します。

Lenses が私の問題の解決策になるかもしれませんが、それらは非常に抽象的であり、それらが何であるのか、どのように使用するのかわかりません。

私よりも知識のある人が少しのガイダンスを提供できますか?

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

4

1 に答える 1

3

これにはaesonを再利用できないと思います。aesonのParserドキュメントから:

解析は次の 2 つのフェーズで行われると考えると便利です。

  • JSON 値のテキスト境界の識別。これは常に厳密であるため、無効な JSON ドキュメントをできるだけ早く拒否できます。
  • JSON 値から Haskell 値への変換。これは、即時 (strict) または遅延 (lazy) のいずれかです。詳細については、以下を参照してください。

最初の箇条書きは、(少なくとも私には) パーサーは、解析が成功したか失敗したかを知るために解析するはずの文字列を十分に検査するまで、何も渡さないことを暗示しているようです-あなたの場合、それはほとんどですもちろん文字列全体。したがって、このフェーズでは、オブジェクト全体 (の何らかの表現) を一度にメモリに配置します。

このプロパティは、現時点ではほとんどのパーサー コンビネーター ライブラリに当てはまります。代わりにuu-parsinglibを調べることを検討できます。部分的な解析を返すことをサポートしていると思います。Hackage ページからリンクされている、その機能を説明する非常に読みやすい論文があります。

于 2015-06-27T22:48:26.723 に答える