Doctrine查询内存使用情况

Fra*_*rth 10 php doctrine memory-management

Doctrine似乎占用了超过4MB的RAM来执行一个简单的查询:

print memory_get_peak_usage()." <br>\n";
$q = Doctrine_Query::create()
    ->from('Directories d')
    ->where('d.DIRECTORY_ID = ?', 5);

$dir = $q->fetchOne();
print $dir['name']." ".$dir['description']."<br>\n";

print memory_get_peak_usage()." <br>\n";

/***************  OUTPUT:  **************************

6393616
testname testdescription
10999648

/***************************************************/
Run Code Online (Sandbox Code Playgroud)

这是在一个测试数据库中,其中包含非常少的数据 - 我查询的项目不包含除此处显示的数据之外的任何数据.

我的系统设置方式是否有可能出现问题,或者是Doctrine的标准内存使用情况?

Pas*_*TIN 6

从我所看到的,你的代码似乎没有错...


作为测试,我已经设置了一个快速示例,其中包含一个非常简单的表(只有四个字段).

这是相关代码:

var_dump(number_format(memory_get_peak_usage()));

$test = Doctrine::getTable('Test')->find(1);

var_dump(number_format(memory_get_peak_usage()));
Run Code Online (Sandbox Code Playgroud)

这样做时,我有这样的输出:

string '1,316,088' (length=9)
string '2,148,760' (length=9)
Run Code Online (Sandbox Code Playgroud)

考虑到桌子非常简单,而且我只取一条线,对我来说似乎"很多" - 但这与你得到的结果非常一致,并且与我在其他项目中看到的一致:-(


如果您只需要显示数据,而不是使用它(即更新/删除/ ...),解决方案可能不是获取复杂对象,而只是一个简单的数组:

$test = Doctrine::getTable('Test')->find(1, Doctrine::HYDRATE_ARRAY);
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,它并没有太大的区别,实际上:-(:

string '1,316,424' (length=9)
string '2,107,128' (length=9)
Run Code Online (Sandbox Code Playgroud)

只有40 KB的差异 - 好吧,更大的物体/更多的线条,它可能仍然是一个好主意...


在Doctrine手册中,有一个名为Improved Performance的页面; 也许它可以帮助你,特别是对于这些部分:


哦,顺便说一下:我在PHP 5.3.0上做过这个测试; 也许这会对使用的内存量产生影响......


rvd*_*vid 5

我同意romanb的回答 - 使用大型库/框架时,使用OpCode缓存是必须的.

与OpCode缓存相关的示例

我最近采用了Zend Framework的Doctrine用法并对内存使用感到好奇 - 所以和OP一样,我创建了一个使用类似OPs测试标准的方法,并将其作为一个整体测试运行,以查看ZF + Doctrine的峰值内存使用量是多少是.

我得到了以下结果:

没有APC的结果:

10.25 megabytes
RV David
16.5 megabytes
Run Code Online (Sandbox Code Playgroud)

APC的结果:

3 megabytes
RV David
4.25 megabytes
Run Code Online (Sandbox Code Playgroud)

操作码缓存具有非常显着的差异.