Symfony 条令批处理不';你不能清除记忆吗?
我正在尝试使用来处理大量对象。这项技术表明,通过使用迭代器并在处理每次迭代后分离,内存使用量应该保持在最低限度(他们说处理10000条记录会增加几KB) 但是,当我尝试执行此操作时,没有看到任何对象被释放。事实上,我正在检索2000多个资产,这将使我的内存使用量增加90MB。显然,这些对象不会被释放。谁能告诉我我做错了什么?我的代码如下所示:Symfony 条令批处理不';你不能清除记忆吗?,symfony,doctrine,batch-processing,Symfony,Doctrine,Batch Processing,我正在尝试使用来处理大量对象。这项技术表明,通过使用迭代器并在处理每次迭代后分离,内存使用量应该保持在最低限度(他们说处理10000条记录会增加几KB) 但是,当我尝试执行此操作时,没有看到任何对象被释放。事实上,我正在检索2000多个资产,这将使我的内存使用量增加90MB。显然,这些对象不会被释放。谁能告诉我我做错了什么?我的代码如下所示: $profiles = //array of Profile entities $qb = $this->createQueryBuilder('
$profiles = //array of Profile entities
$qb = $this->createQueryBuilder('a')
->addSelect('file')
->leftJoin($profileNodeEntityName, 'pn', JOIN::WITH, 'pn.icon = a OR pn.asset = a')
->leftJoin(
$profileEntityName,
'p',
JOIN::WITH,
'pn.profile = p OR p.logo = a OR p.background = a OR p.pricelistAsset = a OR p.pdfTplBlancAsset = a OR p.pdfTplFrontAsset = a OR p.pdfTplBackAsset = a'
)
->innerJoin('a.currentFile', 'file')
->where('p IN (:profiles)')
->setParameter('profiles', $profiles)
->distinct(true);
$iterableResult = $qb->getQuery()->iterate();
$start = memory_get_usage() / 1024;
while (($row = $iterableResult->next()) !== false) {
// process $row[0]
$this->getEntityManager()->detach($row[0]);
}
$end = memory_get_usage() / 1024 - $start;
// $end is more of less equal to 90000 or 90 MB
谢谢 您还应该分离相关的实体,或者在关联上设置cascade={“detach”}。是的,应该这样做。我使用同样的技术将100多万个实体序列化为XML,同时不使用超过60兆的内存。还有一件事:条令手册告诉我们,iterate()方法不适用于连接实体的结果集对于获取并加入集合值关联的查询,无法迭代结果。这种SQL结果集的性质不适合于增量分析。”