【发布时间】: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