私はループ内での追加てるの配列を持っている:PHPメモリが使い果たされました - 配列かsql?
array_push($obj->{$type.'listings'}, $listing);
ループは、リモート呼び出しの束を作り、私は、ファイルに格納し、キャッシュの一種として使用するデータに引っ張ります。
この「キャッシュルーチン」を実行しているときに、この配列をシリアル化すると、わずか5MBを超えることが報告されます。 5MBのアレイを作成するために、スクリプトは100MBのメモリを消費します。可能な限りメモリを解放するための変数を設定しないように非常に注意しています。私は、すべてのコメントを書き、関数のメモリがどこに蓄積されているかを見るためにコメントを外しました。確かに私は配列にプッシュとしてそれが発生します。 array_pushを使用しない場合、memory_get_usage()とgc_collect_cycles()を使用すると、いくつかのスパイクで使用されているかなり安定した量のメモリを見ることができます。
私が配列にプッシュすると、すべてが狂ってしまい、メモリの使用量が増えてしまいます。
このような状況を処理する方法はありますか。
このような大きな配列をPHPで構築することはできませんか?
私はそれを構築している間に配列をファイルにフラッシュする方法はありますか?そして、それをビルドしてファイルに保存できると仮定します。私はそれを使用したいとき、一度ファイルから引っ張られた同じ量のリソースを使用しますか?それは動的に追加されているため、メモリの枯渇が起きているのですか?
これはSQLの使用を検討する必要がありますか?ループの各実行を別々の行に格納していますか?
ちょうどキックのために、私は:ini_set('memory_limit', '-1');
を実行するかどうかを確認するために追加しました。
これはありました。メモリ使用量はわずか100MBを超え、シリアル化されたオブジェクトサイズはわずか8MBを超えました。さて、これは私がデータのサンプルを処理していて、これがはるかに大きくなる可能性があるので、実際には役に立ちません。
とにかく、このような状況を最適化する上で考えていることは素晴らしいと思います。
あなたは設定を慎重にしていると言います - あなたはmySQLの結果を解放していますか?あなたが十分なことをすれば、それはあまりにもメモリを吸う傾向があります。 – Westie
私は今のところSQLに何も格納していません。私はそれがより良いルートであるかどうかを尋ねていただけです。しかし、データの取得にはいくつかのSQLクエリがあり、それらを解放するために、結果セットを$ resultに保持するunset($ result)を使用しています。 –
私は決して言いませんでした。私が意図したことは、 'mySQLi_Result :: Free()'やあなたが使っているものを使用していたことです。あなたの要求でunset()がメモリを完全に解放するかどうかは特に分かりません。 – Westie