18

私は、API をヒットし、JSON ファイル (オブジェクトの大きな配列) を受け取り、それをローカルに保存する cron スクリプトに取り組んでいます。それが完了したら、別のスクリプトでダウンロードした JSON ファイルを解析し、各オブジェクトを MySQL データベースに挿入する必要があります。

私は現在、file_get_contents()と一緒に使用していjson_decode()ます。これは、ファイルを処理する前に、ファイル全体をメモリに読み込もうとします。私のJSONファイルが通常250MBから1GB以上の範囲になるという事実を除いて、これは問題ありません. PHP のメモリ制限を増やすことができることはわかっていますが、それは私の考えでは最善の答えではないようです。fopen()ファイルを実行しfgets()て行ごとに読み取ることができることは承知していますが、json オブジェクトごとにファイルを読み取る必要があります。

オブジェクトごとにファイルを読み込む方法はありますか、または別の同様のアプローチがありますか?

4

3 に答える 3

10

このlibを試してくださいhttps://github.com/shevron/ext-jsonreader

PHPに付属している既存のext/jsonは非常に便利で使いやすいですが、大量のJSONデータを処理する場合は、JSONデータ全体をメモリに読み込む必要があるため(たとえば、file_get_contents()を使用)、非効率的です。一度にPHP変数に変換します-大きなデータセットの場合、これは多くのメモリを消費します。

JSONReaderは、メモリ効率を高めるように設計されています。ストリームで機能し、データ全体をメモリにロードしなくても、任意のPHPストリームからJSONデータを読み取ることができます。また、開発者は、すべてのデータをデコードしてメモリにロードすることなく、JSONストリームから特定の値を抽出できます。

于 2013-03-12T22:54:33.687 に答える
6

これは、json ファイルの内容に大きく依存します。

ファイルをメモリにワンショットで開くことがオプションではない場合、他の唯一のオプションは、あなたが逃したように、fopen / fgetsです。

行ごとの読み取りが可能であり、これらの json オブジェクトが一貫した構造を持っている場合、ファイル内の json オブジェクトがいつ開始され、いつ終了するかを簡単に検出できます。

オブジェクト全体を収集したら、それをデータベースに挿入してから、次のオブジェクトに進みます。

それ以上のことはありません。json オブジェクトの開始と終了を検出するアルゴリズムは、データ ソースによっては複雑になる可能性がありますが、以前ははるかに複雑な構造 (xml) でこのようなことを行ったことがあり、問題なく動作しました。

于 2013-03-12T22:36:26.963 に答える
3

可能な最善の解決策:

ある種の区切り文字(ページネーション、タイムスタンプ、オブジェクトIDなど)を使用して、複数のリクエストにわたって小さなチャンクでデータを読み取ることができます。このソリューションは、これらのJSONファイルの生成方法を何らかの方法で制御できることを前提としています。私は私の仮定を以下に基づいています:

私のJSONファイルが通常250MB-1GB+の範囲であるという事実を除いて、これは問題ありません。

1GBのJSONデータを読み込んで処理するのはばかげています。より良いアプローチが最も確実に必要です。

于 2013-03-12T22:43:18.100 に答える