Doctrine clear() 和多对一关系

Doctrine clear() and many to one relation

我需要从 csv 文件导入大数据(大约 100 万条记录)。 为了避免内存泄漏,我尝试从 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();

问题是我的插入包含 "many to one" 关系,每次我使用 clear() 对象时都会从该关系中复制条目。

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

使用 ORM 导入大数据非常耗费时间和内存。我从来没有找到用 Doctrine 进行快速和理智导入的方法。除了我用这种方式制作的导入外,还有一个 PITA 需要维护。

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

  • 临时导入 CSV table(在 MySQL 中加载数据 INFILE 或在 pgsql 中复制)
  • 进行插入或更新查询(INSERT INTO .. SELECT .. ON DUPLICATE KEY in MySQL)
  • 根据复杂性在 SQL 或 PHP 中做更具体的事情

这样我可以在几秒钟内导入十几个大的 CSV 文件。

希望对您有所帮助。

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

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

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