2017-08-16 1 views
-2

Ich habe ein Problem mit dem Importieren von Daten aus CSV in die Datenbank.So importieren BigData mit Symfony

Vorerst sieht mein Code wie folgt aus:

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(); 
} 

Jede Zeile Ich mache auswählen und einfügen. Meine CSV-Datei hat 100k Zeilen. In 1 Stunde, dieser Code importiert nur 10k Zeilen :(

Alle Ideen, wie kann ich es optimieren

Filip

+1

Machen Sie so wenig wie möglich innerhalb einer Schleife, holen Sie das Repository und den Entity Manager nicht innerhalb der Schleife und spülen Sie nicht jedes Mal. – JimL

+1

Ich würde nur eine einfache dql-Abfrage verwenden und ausführen. Sie sollten die Abfrage außerhalb der Schleife vorbereiten und innerhalb der Schleife ausführen. Und spülen Sie die Änderungen nicht zu oft – JimL

+0

@JimL was meinst du mit der Vorbereitung der Abfrage außerhalb der Schleife? Können Sie ein Beispiel geben? –

Antwort

2

Verwenden Sie SQL

Von Lehre Website part about mass procesing:..

Ein ORM-Werkzeug eignet sich nicht in erster Linie für Masseneinfügungen, -aktualisierungen oder -löschungen

+0

Nizza Downvote auf die einzige richtige Antwort. Möchten Sie etwas Nützliches kommentieren? – svgrafov

+0

Nicht sicher, da ich es nicht war, aber ich vermute, es ist, weil Sie einfach "SQL verwenden" ohne Erklärung, wie oder warum, und dann Sie mit Dokumentation verknüpft, die tatsächlich eine Möglichkeit gezeigt hat, tatsächlich einfügen und einfügen Verbessern Sie die Geschwindigkeit, während Sie weiterhin Doctrine verwenden, überspringen Sie das aber und setzen Sie einfach dieses Zitat ein. Ich würde Ihre Antwort wahrscheinlich etwas genauer bearbeiten. –

Verwandte Themen