2011-12-16 36 views
8

Tôi có tình huống sau đây:Symfony2 - doctrine2 xử lý hàng loạt

tôi cần phải tạo ra một số lượng lớn các thực thể (Entity C) dựa trên một cặp thực thể

  • Entity A (45)
  • Entity B (700000+)
  • Entity C (45 x 700000)
  • Entity D

Vì vậy, tôi quyết định phải làm như sau:

$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(); 

tôi làm theo hướng dẫn từ doctrine2-batch-processing

nhưng khi tôi thực hiện $em->detach($row[0]); và tuôn ra nhận được một lỗi Một thực thể mới được tìm thấy thông qua các mối quan hệ ...

Tôi đã thử mà không có $em->detach($row[0]); nhưng mức tiêu thụ bộ nhớ cao này

Tôi cần: là để giải phóng bộ nhớ o f mỗi thực thể B, sau khi sử dụng, nhưng đồng thời mỗi tuôn ra hoặc theo nhóm và không từng người một, và rõ ràng tất cả các thực thể C

+1

Nó không cần thiết phải tách tổ chức của bạn như bạn thường sẽ xóa quản lý tổ chức của bạn. – Herzult

+0

hoạt động tốt nếu thực thi '$ batchSize = 50', nhưng không phải là số tốt cho tôi – rkmax

+0

Đó là vì bạn tách thực thể của mình trước khi xả để nó được coi là một thực thể mới bởi người quản lý tổ chức ... – Herzult

Trả lời

1

Gọi clear() on entity manager detaches TẤT CẢ các đối tượng (theo mặc định). Btw, bạn có thể chuyển tên thực thể để tách các thực thể thuộc loại đã cho:

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

Tôi nghĩ bạn đang cố gắng tách thực thể đã tách ra và do đó nó được coi là mới.

Hãy thử xóa cuộc gọi clear(). Bạn cũng có thể thử xóa detach() gọi và gọi clear() trên các thực thể được chọn.

+0

tôi nhận được' [Học thuyết \ ORM \ ORMException] EntityManager # clear ($ entityName) chưa được triển khai.' – rkmax

+0

Dường như nó được thực hiện trong nhánh chính của Doctrine2: https://github.com/doctrine/doctrine2 – AlterPHP

+0

tôi đã cài đặt '2.1.4' là bản mới nhất có trong 'Symfony 2.0.7' – rkmax

1

Bạn phải thể hiện đầy đủ tên đơn vị

$em->clear('Acme\MyBundle\Entity\EntityB'); 
$em->clear('Acme\MyBundle\Entity\EntityC'); 
Các vấn đề liên quan