Php 如何使用symfony导入bigdata
我有一个从csv导入数据到数据库的问题 目前,我的代码如下所示:Php 如何使用symfony导入bigdata,php,database,symfony,csv,import,Php,Database,Symfony,Csv,Import,我有一个从csv导入数据到数据库的问题 目前,我的代码如下所示: public function run() { $this->startProgressBar(); foreach ($this->elements as $element) { $this->insertCity($element); $this->advanceProgressBar(); } $this->finishProgre
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行:(
任何想法,我如何优化它
Filip.使用SQL
从学说网站:
ORM工具主要不适合大规模插入、更新或删除
在循环中尽可能少做,不要在循环中获取存储库和实体管理器,并且不要每次刷新。我只考虑使用简单的DQL查询并执行它。应该在循环之外准备查询并在循环内执行。并且不刷新这些更改。often@JimL你说准备查询是什么意思t跳过循环?你能提供一个例子吗?你应该坚持每次迭代,但只有当你排队(相当多)几个实体要坚持时才刷新(更新数据库)。太好了:)始终记住在循环内尽量少做,请记住,您正在运行该代码10万次^^如果您在循环中调用一个函数来循环某些内容等,情况会变得更糟。请保持简单:)对唯一正确的答案投赞成票。有什么有用的评论吗?不确定,因为不是我,但我猜是因为你只是简单地说了“使用SQL”,没有解释如何使用或为什么使用,然后你链接到了文档,实际上展示了一种方法,可以在仍然使用原则的情况下进行批量插入并提高速度,但跳过了这一点,只是简单地引用了这句话。我可能会把你的答案修改得更具体一点。