2013-02-25 19 views
5

私はjson_decodeしようとする大きなjsonファイル(7.3MB)を持っており、メモリ制限(致命的なエラー:134217728バイトのメモリサイズが使い尽くされているため)で失敗します。 jsonファイルを一度に1つのオブジェクト/ノードでシリアルにデコードする方法はありますか?メモリ制限によるシリアルjson_decode

+0

あなたはこのようなものを考えましたか?ini_set( 'memory_limit'、 '256M'); '? – HamZa

+0

カスタムパーサがyesの場合、json_decodeは文字列全体を読み込みます。とにかく結果オブジェクト全体をメモリに保存しようとするなら、十分なメモリを節約していないかもしれません。 – datasage

+0

構造によって異なります。オブジェクトの配列であれば、レベル1でのデコードを再開することは、どのパーサでも簡単です。 PEARs Services_Jsonまたはupgradephp/json_decodeは、そのようなものに対しては確かにハッキングされる可能性があります。ネストされた構造体を繰り返し解析することは、JSONパーサーが通常実装される再帰的な方法のために、より面倒です。 – mario

答えて

0

理論的には、文字列の先頭と末尾の文字を解析するロジックを記述し、オブジェクト/配列表現を構築しながらメモリ内の文字列サイズを繰り返し減らすことができますが、それは深刻な痛みになります。

メモリの容量を増やすだけでなく、頻繁にデコードする必要があるJSON(ウェブアプリケーションへのリクエストごと)が必要な場合は、より多くの使用コンポーネントに分割することを検討する必要があります。

+2

これは理屈上の問題ですが、メモリを増やすことができますが、jsonサイズが3GBの場合はどうなるでしょうか。 すべての{}記号を数え、レベル1、オブジェクト999999などで開始できるようにするライブラリがあるかどうかを尋ねています(ファイルのどこにあっても、 )そしてそこからオブジェクトやサブオブジェクトを一度にデコードする –

+0

'json_decode'関数の2番目のパラメータ(' bool $ assoc = false')を有効にしようとしましたか?これは、JSONをオブジェクトの代わりに単純な配列に格納して、メモリを節約することができます。 – MatRt

+0

これで十分でない場合は、独自の単純なパーサーを作成する必要があります。それは、SAX JSONパーサのPHP実装がないようです – MatRt