请参阅Batch Processing in Doctrine documentation。想法是在每个新实体上调用persist()
,但只有在一组n
实体持续存在后才使用flush()
。对于每个实体来说,花费的时间要少于拨打persist()
,然后flush()
。
例如:
$batchSize = 20;
for ($i = 1; $i <= 10000; ++$i) {
$user = new CmsUser;
$user->setStatus('user');
$user->setUsername('user' . $i);
$user->setName('Mr.Smith-' . $i);
$em->persist($user);
if (($i % $batchSize) === 0) {
$em->flush();
}
}
我删除clear()
因为它会脱离所有实体。例如,如果您将foreach() {}
与实体配合使用,则会出现问题,因为Doctrine2会分离实体,因此循环将为中断。
没有使用clear()
,Doctrine2在内存中保留所有持久化的实体,如果它占用的内存比PHP可以使用的更多,它可能会导致错误。
如果您在循环中对Doctrine存储库以外的内容进行迭代,则可以在flush()
之后调用clear()
。
这是工作的方式是建立在一个阵列被保留和储存所有实体。一旦XML文件被读取,它就会遍历数组,并在每个实体上运行“持久化”。然后它称为“冲洗”。我现在意识到这不是最好的方法。它应该在创建时保留每个实体,然后定期刷新。 –