4

PHP スクリプトで奇妙な問題が発生し続けます。スクリプトの考え方は、MySQL テーブルから大量のデータを取得して処理し、別のテーブルのデータと比較して、結果を CSV 形式のファイルに出力することです。

このスクリプトは、完了するまでに数十万回の反復を実行します。私が抱えている問題は、配列で unset() を使用し、MySQL クエリで free() を使用しても、反復が 350,000 前後になるまでメモリが引き続き使用され、メモリが不足することです。

間違いなく、スクリプトを実行するたびに、memory_get_usage() によって報告されるメモリ割り当ては、約 1050 回の反復まで同じままです。次に、正確に 262,144 バイト増加します。また、テストを通じて、スクリプト内のまったく同じ場所で常にインクリメントされます。以下のコード ブロックでは、b2a の反復の 1 つ (最大 4 回の反復) で常にインクリメントされます。

//up here we get the data to run analysis/comparisons on.

echo "{$lineCounter}b:  " . memory_get_usage(TRUE) . "\n"; //27525120
if ($AttResults = $db_cx->query($ObsAttQuery)) {
   echo "{$lineCounter}b1:  " . memory_get_usage(TRUE) . "\n"; //27525120
   $attArray = array();
   echo "{$lineCounter}b2: " . memory_get_usage(TRUE) . "\n"; //27525120
   while ($attRow = $AttResults->fetch_object()) {
      echo "{$lineCounter}b2a {$attRow->attId}: " . memory_get_usage(TRUE) . "\n"; //27787264
      $attArray[$attRow->attId] = $attRow->value;
   }
echo "{$lineCounter}b3: " . memory_get_usage(TRUE) . "\n"; //27787264
$AttResults->free();
if (empty($attArray)) continue;

//down here after it is done I have an unset on the $attArray variable

試してみるべきことに関する提案はありますか??

4

2 に答える 2

0

バージョン5.3より前のphpには、非常に愚かなガベージコレクターがありました。PHP5のオブジェクトによるメモリリークです。これでは、でメモリを解放することさえできませんでしたunset()。設定を解除する前に循環参照を解除するか、少なくともphp5.3を使用する必要があります。

于 2013-02-11T21:59:03.980 に答える
0

次の方法で取得したデータを見ましたか。

$attRow = $AttResults->fetch_object()

反復前/前後 1050 ?

...そして...はい、メモリが変更されるかどうかを確認するために、ループの前に 1 つのフェッチ、終了の前に 1 つのフェッチを使用して、while の割り当てを変更します。

于 2013-02-13T01:10:32.387 に答える