Symfony2 - 学说批处理

标签 symfony doctrine-orm batch-processing

我有以下情况:

我需要基于一对实体创建大量实体(实体 C)

  • 实体 A (45)
  • 实体 B (700000+)
  • 实体 C (45 x 700000)
  • 实体 D

  • 所以我决定做以下事情:
    $AEntities = $em->getRepository('MyBundle:EntityA')->findAll();
    $DEntity = $em->getRepository('MyBundle:EntityD')->findOneBy($params);
    
    $iterableResult = $em->getRepository('MyBundle:EntityB')
                    ->createQueryBuilder('b')
                    ->getQuery()->iterate();
    $batchSize = 50
    
    while (($row = $iterableResult->next()) !== false) {
      foreach($AEntities as $AEntity) {
        $entity = new Entity\EntityC();
        $entity->setEntityD($DEntity);
        $entity->setEntityB($row[0]);
        $entity->setEntityA($AEntity);
        $em->persist($entity);
      }
    
      if(($i % $batchSize) == 0){
        $em->flush();
        $em->clear();
      }
      $em->detach($row[0]);
      $i++;
    }
    
    $em->flush();
    

    我按照 doctrine2-batch-processing 的说明进行操作

    但是当我执行 $em->detach($row[0]);并刷新得到错误通过关系找到了新实体...

    我试过没有 $em->detach($row[0]);但是这种高内存消耗

    我需要 : 就是释放每个Entity B的内存,使用后,但同时每次flush或者分组而不是一个一个,清空所有Entity C

    最佳答案

    调用 clear() on entity manager分离所有对象(默认情况下)。顺便说一句,您可以传递实体名称以分离给定类型的实体:

    $em->clear('EntityB'); 
    $em->clear('EntityC');
    

    我认为你试图分离已经分离的实体,因此它被视为新的。

    尝试删除 clear()称呼。您也可以尝试删除 detach()来电咨询clear()在选定的实体上。

    关于Symfony2 - 学说批处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8540697/

    相关文章:

    ffmpeg - 如何使用 ffmpeg 将带有子文件夹的整个目录转换为相同的格式?

    java - JPA 2.0 : How to improve performance on bulk insertion through JPA

    php - symfony 子查询中出现错误

    php - Doctrine 找不到 PostgreSQL PDO 驱动程序?

    symfony - 生产环境如何使用数据库装置

    authentication - 为什么我的用户登录在升级到 Symfony3 后不再有效

    symfony - 在 Twig 中设置简单的 bool 值

    symfony - 如何通过 Symfony2 设置更改 Twig 加载程序

    php - OneToMany 或 OneToOne,我走的路对还是错?

    python 3.5 : Moving files to folder based on filenames