我有一个使用Doctrine2 ORM的Symfony 2应用程序。我尝试从XML文件创建实体,然后持久化这些实体。典型的XML文件可能包含几千条需要持久化的记录。XML中的每条记录并不直接Map到单个实体,而是Map到一个实体,然后Map到一对多关系中“多”方的其他一些实体。我可以从XML元素中创建实体,但是在实体上运行“持久化”,每个操作在我的机器上大约需要2秒。从XML文件导入几千条记录,这对我们的需要来说太慢了。有人能提供帮助吗?
ajsxfq5m1#
参见Batch Processing in Doctrine documentation。其思想是在每个新实体上调用persist(),但仅在持久化一组n实体后才使用flush()。这比为每个实体调用persist()然后调用flush()所需的时间更少。举例来说:
persist()
n
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()。
clear()
foreach() {}
nukf8bse2#
谢谢你的帮助这就是我如何让它工作得更快;在创建并持久化了20个实体之后,我在实体管理器上调用了flush()和clear(),这意味着需要链接到我正在创建的实体的相关实体在doctrine中丢失了,因此需要从数据库中重新加载它。现在每个实体大约需要0.02秒--这并不完全是 lightning 般的快,但要快得多
2条答案
按热度按时间ajsxfq5m1#
参见Batch Processing in Doctrine documentation。其思想是在每个新实体上调用
persist()
,但仅在持久化一组n
实体后才使用flush()
。这比为每个实体调用persist()
然后调用flush()
所需的时间更少。举例来说:
字符串
我删除了
clear()
,因为它会分离所有的实体。如果你使用foreach() {}
和实体,这是一个问题,因为Doctrine2会分离实体,循环将被 * 打破 *。在不使用
clear()
的情况下,Doctrine2将所有持久化的实体保存在内存中,如果它占用的内存超过PHP可以使用的内存,则会导致错误。如果您在Doctrine存储库之外的其他存储库上迭代循环,那么您可以在
flush()
之后调用clear()
。nukf8bse2#
谢谢你的帮助
这就是我如何让它工作得更快;
在创建并持久化了20个实体之后,我在实体管理器上调用了flush()和clear(),这意味着需要链接到我正在创建的实体的相关实体在doctrine中丢失了,因此需要从数据库中重新加载它。
现在每个实体大约需要0.02秒--这并不完全是 lightning 般的快,但要快得多