私はデータセットにロードするJSONファイルを生成します。これらのJSONファイルには、データベースの何千もの行が含まれます。これらを生成するには、データベースのすべての行をループし、各データベース行をJSONファイルの新しい行として追加する必要があります。私はに実行している問題は、このです:私がやっている何PHP - JSONファイルに追加する方法
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 262643 bytes)
、私はその後、私は配列に新しい行を追加するのfile_get_contents($ json_file)とJSONファイルを取得し、配列にそれをデコードしています配列をJSONにエンコードし、file_put_contents($ json_file)でファイルにエクスポートします。
これを行うより良い方法はありますか?各ループ反復でメモリが増えるのを防ぐ方法がありますか?それとも限界に達する前に記憶をクリアする方法はありますか?私はスクリプトを完了するまで実行する必要がありますが、このメモリの問題では、クラッシュする前に5%の完了を達成することはほとんどありません。
スクリプトを再実行して再実行するとJSONファイルに行が追加されるため、このメモリの問題が避けられない場合は、スクリプトが完了するまで自動的にスクリプトを何度も再実行する方法がありますか?たとえば、私はメモリの使用量を検出し、その限界に近づいてからスクリプトを終了して再起動することを検出できますか?私は熟しているので、exec()のようなセキュリティ上の危険な機能を許可しません。
最初に質問したのは、メモリー、DB、ファイルサイズ、配列サイズなどを実行していることです。128Mを使用しているのは、まともなサーバー上で約512Mまでかなり安全です。しかし、それは実際の問題が何であるかに応じて短期的な解決策になるかもしれません。 – ArtisticPhoenix
ファイルが1つの大きなJson配列であるのか、複数のjson配列が1つのファイルにあるのかは疑問ではありません。私は 'file_put_contents'のために1つを仮定しますか? – ArtisticPhoenix
jsonの問題は、完全なオブジェクトをメモリに持たなければならないということです.CSVを使用することができれば、このような問題は起こりません。コンテンツを読み込まなくても行を追加することもできます。しかし、ネストされたデータがあり、すべての行(ヘッダー)に同じスキーマがあります。 CSVファイルを読み込んで一度に1行ずつ書き込むことができます。ファイルサイズでOSの整数制限を上げることができます。私は個人的に1000万行を超えるファイルを作成しました。あなたが何であるかを知らなければ、それはちょうどカンマで区切られたリストで、ヘッダー行が付いています。 – ArtisticPhoenix