PHP随着时间的推移循环减速

时间:2013-03-05 16:55:51

标签: php

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

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

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

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

问题是,在600k标记附近,循环开始减速,而在800k时,它每秒处理几条记录。

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

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

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

1 个答案:

答案 0 :(得分:2)

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

在一次终端运行中

vmstat 3 100

运行脚本并观察vmstat。查看IO和SWAP。如果确实不是这种情况,那么使用XDEBUG进行概要执行。这可能很棘手,因为你做了很多迭代,这也会导致主要的IO。