Symfony和Doctrine中的批量插入:如何选择批量大小?

And*_*ord 5 symfony doctrine-orm

我正在使用Symfony 2.7Doctrine开发一个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(),我看到进度条变慢了,看起来我的程序变慢了,因为我在内存中添加了越来越多的实体.