And*_*ord 5 symfony doctrine-orm
我正在使用Symfony 2.7和Doctrine开发一个Web应用程序.Symfony命令用于执行大量实体的更新.
我遵循了主义准则,$entityManager->flush()并不是每个实体都使用.
这是Doctrine示例代码:
<?php
$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();
}
}
$em->flush(); //Persist objects that did not make up an entire batch
Run Code Online (Sandbox Code Playgroud)
准则说:
您可能需要尝试批量大小以找到最适合您的大小.较大的批量大小意味着内部更准备的语句重用,但也意味着更多的工作在刷新期间
所以我确实尝试了不同的批量大小.批处理大小越大,命令完成其任务的速度就越快.
因此问题是:大批量的缺点是什么?$entityManager->flush()在更新所有实体后,为什么不使用一次
文件说,更大的批量大小"意味着更多的工作时间".但是为什么/何时这可能是一个问题?
我可以看到的唯一缺点是Exceptions在更新期间:如果脚本在保存更改之前停止刷新,则更改将丢失.这是唯一的限制吗?
A.L*_*A.L 10
大批量的缺点是什么?
如果为示例创建10,000个实体,则大批量可能会占用大量内存.如果不以批处理方式保存实体,它们将在内存中累积,如果程序达到内存限制,则可能会导致整个脚本崩溃.
$entityManager->flush()在更新所有实体后,为什么不使用一次
这是可能的,但是在调用flush()一次之前在存储器中存储10,000个实体将比使用100保存实体100使用更多的存储器.这可能还需要更多时间.
文件说,更大的批量大小"意味着更多的工作时间".但是为什么/何时这可能是一个问题?
如果您对最大批量大小没有任何性能问题,可能是因为您的数据不足以填满内存或破坏PHP的内存管理.
因此批量的大小取决于多个因素,主要是内存使用量与时间的关系.如果脚本占用太多RAM,则必须降低批处理的大小.但是使用非常小的批次可能比更大的批次花费更多的时间.因此,您必须运行多个测试才能调整此大小,以便它使用大部分可用内存但不能更多.
我没有任何证据,但我记得曾与数千个实体合作过.当我只使用一个时flush(),我看到进度条变慢了,看起来我的程序变慢了,因为我在内存中添加了越来越多的实体.
| 归档时间: |
|
| 查看次数: |
5872 次 |
| 最近记录: |