为什么PHP在sqlsrv_fetch_object期间会占用这么多内存?

时间:2014-08-15 13:52:17

标签: php sql out-of-memory

我一直在使用大量数据(来自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在不需要时会分配如此多的内存?我能做些什么来减少它?

0 个答案:

没有答案