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
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
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
Đó 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