php - 交响乐 : Doctrine data fixture : how to handle large csv file?

标签 php mysql symfony csv doctrine-orm

我正在尝试使用学说数据夹具从“大型”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/

相关文章:

linux - Git merge 已经分离的目录

symfony - 是否可以使用 createQueryBuilder 进行插入/更新?如果没有,我应该使用什么功能?

php - 在 mysql 数据库中搜索值时什么方法更好?

php - Symfony2 和 Twig 中的多语言

php - 使用 fputcsv 时避免来自 csv 文件的默认引号

php - 执行自定义错误处理程序后执行默认异常处理程序

mysql - 如何使用日期时间选择 SQL 中大于特定时间的条目?

php - 将 B 列复制到 A 列(排序)

休息 : return 'method not allowed' or not do the method?

php - mysql 查询没有收到任何结果