【问题标题】:How to import bigdata with symfony [duplicate]如何使用 symfony 导入大数据 [重复]
【发布时间】:2018-01-24 06:03:15
【问题描述】:

我在将数据从 csv 导入数据库时​​遇到了一个问题。

目前,我的代码如下所示:

public function run()
{
    $this->startProgressBar();
    foreach ($this->elements as $element) {
        $this->insertCity($element);
        $this->advanceProgressBar();
    }
    $this->finishProgressBar();
}

/**
 * @param array $item
 */
private function insertCity(array $item = [])
{
    $repository = $this->getDoctrine()->getRepository(Commune::class);
    $commune = $repository->findOneByTerc($this->getTerc($item));

    $district = $item['uid'] == $item['district_uid'] ? null : $item['district_uid'];

    $city = new City();
    $city->setName($item['name']);
    $city->setCommuneId($commune->getId());
    $city->setDistrictUid($district);
    $city->setType($item['city_type']);
    $city->setUid($item['uid']);

    $this->getDoctrine()->getManager()->persist($city);
    $this->getDoctrine()->getManager()->flush();
}

我选择并插入的每一行。我的 csv 文件有 100k 行。在 1 小时内,此代码仅导入 10k 行:(

任何想法,我该如何优化它?

菲利普。

【问题讨论】:

  • 在循环内尽量少做,不要在循环内获取repository和entity manager,不要每次都flush。
  • 我会考虑只使用一个简单的 dql 查询并执行它。您应该在循环外准备查询并在循环内执行。并且不要过于频繁地刷新更改
  • @JimL 关于在循环外准备查询是什么意思?你能举个例子吗?
  • 您应该坚持每次迭代,但只有在您排队(相当)几个要坚持的实体时才刷新(更新数据库)。
  • 太棒了 :) 永远记得在循环内尽量少做,记住你正在运行该代码 100k 次 ^^ 如果你在循环内调用一个函数会变得更糟一些东西,等等。保持简单:)

标签: php database symfony csv import


【解决方案1】:

使用 SQL。

来自 Doctrine 网站,part about mass procesing

ORM 工具主要不适用于大量插入、更新或删除。

【讨论】:

  • 对唯一正确答案投了反对票。想发表任何有用的评论吗?
  • 不确定因为不是我,但我猜这是因为您只是说“使用 SQL”而没有解释如何或为什么,然后您链接到实际显示的文档在仍然使用 Doctrine 的同时实际进行批量插入并提高速度的方法,但跳过了这一点,而只是简单地引用了该引用。我可能会将您的答案编辑得更具体一些。
猜你喜欢
  • 1970-01-01
  • 2019-09-25
  • 2012-12-13
  • 1970-01-01
  • 2017-10-31
  • 2016-12-11
  • 2021-06-29
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多