我一直在使用大量数据(来自SQL Server DB的近200,000条记录)对一些SVG图像代码进行压力测试,并且内存不足。使用xdebug跟踪启用mem_delta我得到:
14.1789 59408336 +520 -> sqlsrv_fetch_object()
14.1790 59408856 +520 -> sqlsrv_fetch_object()
14.1792 59409376 +520 -> sqlsrv_fetch_object()
14.1793 59409896 +520 -> sqlsrv_fetch_object()
14.1794 59410416 +520 -> sqlsrv_fetch_object()
这是代码:
$rows = array();
while ($row = sqlsrv_fetch_object($result)) {
$rows[] = $row;
}
数据库表的模式有三列A,B和C(我重命名它们以尝试减少内存使用量,每个记录保存约20个字节),分别是bigint,int和int。
对于数据本身,我只希望每个记录使用16个字节,加上对象属性标签的3个字节,以及PHP用来管理它的对象的更多字节。尽管如此,这仍应远远超过520字节。
我想也许这是扩展数组的行为,但这并不能解释为什么每次附加一个新项目时它会将它扩展520个字节,以及为什么它一旦完成就不会缩小。
为什么PHP在不需要时会分配如此多的内存?我能做些什么来减少它?