Symfony:Doctrine数据夹具:如何处理大型csv文件?

Cru*_*ruz 9 php mysql csv symfony doctrine-orm

我试图使用doctrine数据夹具从"大"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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Ter*_*oth 13

创建大批量导入时要遵循的两条规则:

  • 禁用SQL日志记录:( $manager->getConnection()->getConfiguration()->setSQLLogger(null);)以避免巨大的内存丢失.

  • 经常冲洗和清理,而不是仅在结束时冲洗一次.我建议你if ($i % 25 == 0) { $manager->flush(); $manager->clear() }在你的循环中添加,以刷新每25个INSERT.

编辑:我忘记了最后一件事:当你不再需要它们时,不要将你的实体保留在变量中.在这里,在循环中,您只需要正在处理的当前实体,因此不要将先前的实体存储在$coordinatesfrcity数组中.如果你继续这样做,这可能会导致内存溢出.

  • 简直令人难以置信.我正在导入一个包含14列和453000行(200Mo)的CSV.脚本花了48小时导入所有行.通过此优化,只需10分钟.那真是太棒了.非常感谢! (2认同)