2016-01-13 126 views
0

我需要从csv文件导入大量数据(大约1m记录)。 为了避免内存泄露我想批量插入从理论文档:Doctrine clear()和多对一的关系

$batchSize = 20; 
for ($i = 1; $i <= 10000; ++$i) { 

    //code 

    $em->persist($user); 
    if (($i % $batchSize) === 0) { 
     $em->flush(); 
     $em->clear(); // Detaches all objects from Doctrine! 
    } 
} 
$em->flush(); //Persist objects that did not make up an entire batch 
$em->clear(); 

问题是我的插入包含“多对一”的关系,每次我用明确的()对象重复条目从这种关系。

有没有可能分离实体并避免重复?

+0

附注:总是建议在进行大批量操作时不要使用Doctrine。您应该使用PDO执行此类任务。 – Joshua

回答

1

是的。您需要执行智能清洁。这意味着你提供了你想要清除的实体类型。例如:

$em->clear(SomeEntity::class); 
$em->clear(OtherEntity::class); 

这将从EM中删除这些类型并保留其他所有内容。这样你就可以重用那些其他的对象。

0

使用ORM导入大数据非常耗时且耗费内存。我从来没有找到一种用教义做出快速和正确导入的方法。除了我用这种方式进口的是PITA来维护。

经过多年的进口数据,我发现的最有效的办法是:在临时表

  • CSV导入(LOAD DATA INFILE在MySQL或复制pgsql的)
  • 使插入或更新查询(INSERT INTO .. SELECT ... ON MySQL中的重复键)
  • 做更具体的事情在SQL或PHP根据复杂

这样我可以导入CSV大FIL的打秒以内。

希望它有帮助。