0

我有看似无害的 while 循环,它遍历 mysql 查询的结果集,并将从 mysql 返回的 id 与一个非常大的多维数组中的一个进行比较:

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

当脚本第一次执行时,它以大约每秒 2-5k 的速度运行结果。有时更多,很少更少。结果集带回 700 万行,脚本的内存峰值为 2.8GB。

就大数据而言,这不是很多。

问题是,在 600k 左右,循环开始变慢,到了 800k,它每秒处理几条记录。

在服务器负载和内存使用方面,没有问题。

这是我之前在处理大型数据集的其他脚本中注意到的行为。

随着内部指针移动得更深,数组寻道时间是否会逐渐变慢?

4

1 回答 1

2

这实际上取决于循环内部发生的情况。我知道您确信这不是内存问题,但看起来很像。当系统试图通过使用 SWAP 获得额外的 RAM 时,程序通常会变得非常慢。使用硬盘驱动器显然非常慢,这就是您可能遇到的情况。对其进行基准测试非常容易。

在一个终端运行

vmstat 3 100

运行您的脚本并观察 vmstat。查看 IO 和 SWAP。如果情况并非如此,则使用 XDEBUG 进行配置文件执行。这可能很棘手,因为您进行了多次迭代,这也会导致主要的 IO。

于 2013-03-05T17:29:21.493 回答