Php 条令clear()和多对一关系

Php 条令clear()和多对一关系,php,symfony,doctrine-orm,many-to-one,Php,Symfony,Doctrine Orm,Many To One,我需要从csv文件导入大数据(大约1m条记录)。 为了避免内存泄漏,我尝试了doctrine文档中的批量插入: $batchSize = 20; for ($i = 1; $i <= 10000; ++$i) { //code $em->persist($user); if (($i % $batchSize) === 0) { $em->flush(); $em->clear(); // Detaches al

我需要从csv文件导入大数据(大约1m条记录)。 为了避免内存泄漏,我尝试了doctrine文档中的批量插入:

$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();
$batchSize=20;
对于($i=1;$i persist($user);
如果($i%$batchSize)==0){
$em->flush();
$em->clear();//从条令中分离所有对象!
}
}
$em->flush();//保留未组成整个批处理的对象
$em->clear();
问题是我的insert包含“多对一”关系,每次使用clear()对象时都会从该关系中复制条目


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

使用ORM导入大数据非常耗时和占用内存。我从来没有找到一种方法使用条令进行快速和理智的导入。此外,我用这种方法进行的导入需要维护

经过多年的数据导入,我发现最有效的方法是:

  • 临时表中的CSV导入(在MySQL中加载数据填充或在pgsql中复制)
  • 进行插入或更新查询(在MySQL中的重复键上插入..选择..)
  • 根据复杂性,在SQL或PHP中执行更具体的操作
这样我可以在几秒钟内导入十几个大的CSV文件


希望有帮助。

是的。您需要执行智能清理。这意味着您提供了要清理的实体类型。示例:

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

这将只从EM中删除这些类型,而保留所有其他类型。这样,您就可以重用这些其他对象。

作为旁注:在执行大批量操作时,始终建议不要使用条令。您应该使用PDO来执行此类任务。这已弃用,并将在3.0中删除: