symfony Doctrine 2 ORM -持久化操作需要很长时间

2sbarzqh  于 2023-11-22  发布在  其他
关注(0)|答案(2)|浏览(133)

我有一个使用Doctrine2 ORM的Symfony 2应用程序。
我尝试从XML文件创建实体,然后持久化这些实体。典型的XML文件可能包含几千条需要持久化的记录。XML中的每条记录并不直接Map到单个实体,而是Map到一个实体,然后Map到一对多关系中“多”方的其他一些实体。
我可以从XML元素中创建实体,但是在实体上运行“持久化”,每个操作在我的机器上大约需要2秒。从XML文件导入几千条记录,这对我们的需要来说太慢了。
有人能提供帮助吗?

ajsxfq5m

ajsxfq5m1#

参见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()

nukf8bse

nukf8bse2#

谢谢你的帮助
这就是我如何让它工作得更快;
在创建并持久化了20个实体之后,我在实体管理器上调用了flush()和clear(),这意味着需要链接到我正在创建的实体的相关实体在doctrine中丢失了,因此需要从数据库中重新加载它。
现在每个实体大约需要0.02秒--这并不完全是 lightning 般的快,但要快得多

相关问题