我看似无害的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时,它每秒处理几条记录。
在服务器负载和内存使用方面,没有问题。
这是我之前在处理大型数据集的其他脚本中注意到的行为。
当内部指针移动得更深时,数组寻道时间是否逐渐变慢?
答案 0 :(得分:2)
这实际上取决于循环内部发生的事情。我知道你确信这不是一个记忆问题,但它看起来像一个。当系统试图通过使用SWAP获得额外的RAM时,程序通常会变得很慢。使用硬盘驱动器显然非常慢,而这正是您可能遇到的情况。对它进行基准测试非常容易。
在一次终端运行中
vmstat 3 100
运行脚本并观察vmstat。查看IO和SWAP。如果确实不是这种情况,那么使用XDEBUG进行概要执行。这可能很棘手,因为你做了很多迭代,这也会导致主要的IO。