我正在尝试使用学说数据夹具从“大型”CSV 文件(3Mo/37000 行/7 列)插入(在 mySQL 数据库中)数据。
这个过程很慢,这次我没能成功(可能是我要多等一会)
我想条令数据装置不是用来管理如此大量的数据的?也许解决方案应该是将我的 csv 直接导入数据库?
知道如何进行吗?
代码如下:
<?php
namespace FBN\GuideBundle\DataFixtures\ORM;
use Doctrine\Common\DataFixtures\AbstractFixture;
use Doctrine\Common\DataFixtures\OrderedFixtureInterface;
use Doctrine\Common\Persistence\ObjectManager;
use FBN\GuideBundle\Entity\CoordinatesFRCity as CoordFRCity;
class CoordinatesFRCity extends AbstractFixture implements OrderedFixtureInterface
{
public function load(ObjectManager $manager)
{
$csv = fopen(dirname(__FILE__).'/Resources/Coordinates/CoordinatesFRCity.csv', 'r');
$i = 0;
while (!feof($csv)) {
$line = fgetcsv($csv);
$coordinatesfrcity[$i] = new CoordFRCity();
$coordinatesfrcity[$i]->setAreaPre2016($line[0]);
$coordinatesfrcity[$i]->setAreaPost2016($line[1]);
$coordinatesfrcity[$i]->setDeptNum($line[2]);
$coordinatesfrcity[$i]->setDeptName($line[3]);
$coordinatesfrcity[$i]->setdistrict($line[4]);
$coordinatesfrcity[$i]->setpostCode($line[5]);
$coordinatesfrcity[$i]->setCity($line[6]);
$manager->persist($coordinatesfrcity[$i]);
$this->addReference('coordinatesfrcity-'.$i, $coordinatesfrcity[$i]);
$i = $i + 1;
}
fclose($csv);
$manager->flush();
}
public function getOrder()
{
return 1;
}
}
最佳答案
像这样创建大批量导入时要遵循的两条规则:
禁用 SQL 日志记录:(
<$manager->getConnection()->getConfiguration()->setSQLLogger(null);
) 以避免大量内存丢失。经常刷新和清除,而不是只在最后一次。我建议你添加
if ($i % 25 == 0) { $manager->flush(); $manager->clear() }
在你的循环中,每 25 个 INSERT 刷新一次。
编辑: 我忘记的最后一件事:当您不再需要实体时,不要将它们保存在变量中。在这里,在您的循环中,您只需要正在处理的当前实体,因此不要将以前的实体存储在 $coordinatesfrcity
数组中。如果您继续这样做,这可能会导致内存溢出。
关于php - 交响乐 : Doctrine data fixture : how to handle large csv file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35792244/