我有几个数据库管理任务需要经过数据库中的每条记录。这是我的理解是与CakePHP的ORM 3.x的,我可以做这样的事情,它会永远只能在内存中有一条记录时间:每次读取记录时内存使用量都会增加
$records = TableRegistry::get('Whatever')->find();
foreach ($records as $record) {
// do some processing
}
然而,这最终有崩溃“内存不足“的例外。我已经添加了一些memory_get_peak_usage
的日志记录,并且每次迭代都会增加,即使除了foreach循环内发生的日志记录之外没有其他任何内容。循环中每次增加约12K。
我正在运行3.2.7,并且结果类似,无论我是否启用了调试和/或SQL日志记录。将频繁拨打的电话添加到gc_collect_cycles()
只会降低过程速度,这对内存使用量没有帮助。
这是预计,或者一个错误?如果前者,有什么我可以以不同的方式在这个代码,以防止它? (很显然,我可以小批量处理它,但这不是一个很好的解决方案。)
您是否尝试过关闭[**结果缓冲**](http://book.cakephp.org/3.0/en/orm/retrieving-data -and-resultsets.html#工薪与对结果集)? – ndm
@ndm,听起来很有希望,所以我跑了几个快速测试,但有些奇怪的是似乎显示内存使用增加*更快*缓冲关闭。完全可能的是,我在测试中做了错误的测试......其他测试崩溃了,告诉我“在其他未缓冲的查询处于活动状态时无法执行查询”,这对我来说可能是一种破坏行为,在这种情况下。我将不得不考虑这个问题,看看是否有解决方案,对代码的干扰性小于运行我需要小批量处理的大查询。 –