0

mysqlクエリの結果セットを通過し、mysqlから返されたIDを非常に大きな多次元配列のIDと比較する、一見無害なwhileループがあります。

//mysqli query here
while($row = fetch_assoc())
{
    if(!in_array($row['id'], $multiDArray['dimensionOne']))
    {
        //do something
    }
}

スクリプトが最初に実行されるとき、毎秒約 2 ~ 5k の速度で結果が実行されます。時にはそれ以上、めったに少なくなりません。結果セットは 700 万行を返し、スクリプトは 2.8GB のメモリでピークに達します。

ビッグデータに関しては、これは多くありません。

問題は、600k マークあたりでループが遅くなり始め、800k までに 1 秒間に数レコードを処理していることです。

サーバーの負荷とメモリの使用に関しては、問題はありません。

これは、大規模なデータ セットを処理する他のスクリプトで以前に気付いた動作です。

内部ポインターが深く移動するにつれて、配列のシーク時間は徐々に遅くなりますか?

4

1 に答える 1

2

それは、ループ内で何が起こるかに大きく依存します。メモリの問題ではないと確信していることは知っていますが、メモリの問題のように見えます。システムが SWAP を使用して追加の RAM を取得しようとすると、プログラムは通常非常に遅くなります。ハード ドライブの使用は明らかに非常に遅く、それが発生している可能性があります。それをベンチマークするのはとても簡単です。

1回のターミナル実行で

vmstat 3 100

scrip を実行して vmstat を観察します。IO と SWAP を調べます。そうでない場合は、XDEBUG を使用して実行をプロファイルします。多くの反復を行い、これも主要な IO を引き起こすため、注意が必要かもしれません。

于 2013-03-05T17:29:21.493 に答える