遍历学说集合占用太多内存
Iterating over doctrine collections takes too much memory
我有一个 symfony2 命令可以浏览我的大数据库并将数据导出到 XML 文件中。
此操作占用太多内存,我可以看到我的 php 进程,当 运行 开始占用 50 MB,然后 100Mb .. 5 分钟后它是 700MB 并且在它完成之前它需要~800MB 这显然是巨大的。
如何优化 Doctrine 使用的内存量?
下面是我的代码:
// Gets 4000 entities
$entities1 = $this->doctrine->getRepository('MyBundle:Entity1')->findAll();
foreach ($entities1 as $entity1)
{
// 200 entities under every entity1
foreach ($entity1->getCollection1() as $c)
{
// write into an xml
}
}
有没有办法优化this/to做得更好?
我建议使用学说 "batch processing" (http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html)。
它允许您处理大量数据并限制使用的 php 内存。所以在你的情况下会是这样的:
$em = $this->doctrine->getManager();
// Gets 4000 entities
$queryEntities1 = $em->createQuery('select e from MyBundle:Entity1');
$iterableEntities1 = $queryEntities1->iterate();
foreach ($iterableEntities1 as $row)
{
$entity1 = $row[0];
// 200 entities under every entity1
foreach ($entity1->getCollection1() as $c)
{
// write into an xml
}
$em->detach($entity1);
}
未测试,但您可能需要为 collection 添加另一个查询!但是这样你的内存将在每个实体之后被清理(不确定它是否足够你的情况但你仍然可以尝试为 collection 的 foreach 添加另一个可迭代请求)。
我有一个 symfony2 命令可以浏览我的大数据库并将数据导出到 XML 文件中。
此操作占用太多内存,我可以看到我的 php 进程,当 运行 开始占用 50 MB,然后 100Mb .. 5 分钟后它是 700MB 并且在它完成之前它需要~800MB 这显然是巨大的。
如何优化 Doctrine 使用的内存量?
下面是我的代码:
// Gets 4000 entities
$entities1 = $this->doctrine->getRepository('MyBundle:Entity1')->findAll();
foreach ($entities1 as $entity1)
{
// 200 entities under every entity1
foreach ($entity1->getCollection1() as $c)
{
// write into an xml
}
}
有没有办法优化this/to做得更好?
我建议使用学说 "batch processing" (http://doctrine-orm.readthedocs.org/en/latest/reference/batch-processing.html)。
它允许您处理大量数据并限制使用的 php 内存。所以在你的情况下会是这样的:
$em = $this->doctrine->getManager();
// Gets 4000 entities
$queryEntities1 = $em->createQuery('select e from MyBundle:Entity1');
$iterableEntities1 = $queryEntities1->iterate();
foreach ($iterableEntities1 as $row)
{
$entity1 = $row[0];
// 200 entities under every entity1
foreach ($entity1->getCollection1() as $c)
{
// write into an xml
}
$em->detach($entity1);
}
未测试,但您可能需要为 collection 添加另一个查询!但是这样你的内存将在每个实体之后被清理(不确定它是否足够你的情况但你仍然可以尝试为 collection 的 foreach 添加另一个可迭代请求)。