9

Ruby で巨大な JSON ファイルを処理するのに問題があります。私が探しているのは、メモリに大量のデータを保持することなく、エントリごとに処理する方法です。

yajl-ruby gem が機能すると思っていましたが、すべてのメモリを消費します。Yajl::FFIと JSON:Stream の gemも調べましたが、次のように明確に記載されています。

より大きなドキュメントの場合、IO オブジェクトを使用してパーサーにストリーミングできます。解析されたオブジェクトのためのスペースがまだ必要ですが、ドキュメント自体が完全にメモリに読み込まれることはありません。

私がYajlで行ったことは次のとおりです。

file_stream = File.open(file, "r")
json = Yajl::Parser.parse(file_stream)
json.each do |entry|
    entry.do_something
end
file_stream.close

プロセスが強制終了されるまで、メモリ使用量は増え続けます。

Yajl が処理済みのエントリをメモリに保持する理由がわかりません。どうにかしてそれらを解放することはできますか? それとも、Yajl パーサーの機能を誤解しただけですか?

Yajl を使用して実行できない場合: ライブラリを介して Ruby でこれを行う方法はありますか?

4

3 に答える 3

5

@CodeGnome と @A の両方。Ragerの答えは、解決策を理解するのに役立ちました。

最終的には、汎用的なアプローチを提供し、すべてのシナリオでコールバックを手動で定義する必要をなくすgem json-streamerを作成しました。

于 2016-05-29T00:16:02.997 に答える