Mein Unternehmen erhält jeden Monat eine Reihe von CSV-Dateien mit Bankkontodaten, die ich in eine Datenbank importieren muss. Einige dieser Dateien können ziemlich groß sein. Zum Beispiel ist einer etwa 33 MB und etwa 65.000 Zeilen.Best Practices für den Import großer CSV-Dateien
Im Moment habe ich eine Symfony/Doctrine App (PHP), die diese CSV-Dateien liest und in eine Datenbank importiert. Meine Datenbank hat ungefähr 35 verschiedene Tabellen, und während des Imports nehme ich diese Zeilen, spalte sie in ihre konstituierenden Objekte und füge sie in die Datenbank ein. Es funktioniert alles wunderbar, außer es ist langsam (jede Zeile dauert etwa eine viertel Sekunde) und es verwendet viel Speicher.
Der Speicherverbrauch ist so schlecht, dass ich meine CSV-Dateien aufteilen muss. Eine Datei mit 20.000 Zeilen macht es kaum fertig. Wenn es fast zu Ende ist, habe ich eine Speicherauslastung von etwa 95%. Das Importieren dieser 65.000 Zeilen Datei ist einfach nicht möglich.
Ich habe festgestellt, dass Symfony ein außergewöhnlicher Rahmen für das Erstellen von Anwendungen ist, und normalerweise würde ich nichts anderes mehr verwenden, aber in diesem Fall bin ich bereit, alle meine Vorurteile im Namen der Leistung aus dem Fenster zu werfen. Ich bin keiner bestimmten Sprache, DBMS oder irgendetwas verpflichtet.
Stack-Überlauf nicht wie subjektive Fragen so dass ich versuchen werde dies als un-subjektiv wie möglich zu machen: für die von Ihnen haben nicht nur eine Meinung, aber Erfahrung importiert große CSV-Dateien, welche Werkzeuge/Praktiken haben Sie in der Vergangenheit verwendet, die erfolgreich gewesen sind?
Verwenden Sie zum Beispiel nur Djangos ORM/OOP und Sie hatten keine Probleme? Oder lesen Sie die gesamte CSV-Datei in den Speicher und bereiten Sie einige gigantische INSERT
Aussagen vor?
Wieder möchte ich nicht nur eine Meinung, sondern etwas, das in der Vergangenheit tatsächlich für Sie gearbeitet hat.
Bearbeiten: Ich importiere nicht nur eine 85-Spalten-CSV-Tabelle in eine 85-Spalten-Datenbanktabelle. Ich normalisiere die Daten und setze sie in Dutzende verschiedener Tabellen ein. Aus diesem Grund kann ich nicht einfach LOAD DATA INFILE
(ich benutze MySQL) oder irgendeine andere DBMS-Funktion verwenden, die nur CSV-Dateien einliest.
Außerdem kann ich keine Microsoft-spezifischen Lösungen verwenden.
Haben Sie am Ende der DB eine Leistungsanalyse durchgeführt, in Bezug darauf, wie die Transaktionen erstellt/festgelegt werden? –
Nein. Mein gesamter Import ist in einer großen Transaktion verpackt. Soweit die einzelnen INSERT-Anweisungen selbst gehen, habe ich keine Performance-Analyse durchgeführt. Jeder Rat dort würde geschätzt werden. (Das allein löst jedoch nicht meine Speicherprobleme.) –