gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 06:28:47 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com