Überprüfung und Implementierung der CSV-Bibliothek zum Laden großer Datenmengen in MySQL (Java)

Warum dieser Artikel?

Ich wollte eine große Anzahl von CSV-Dateien erstellen, um eine große Datenmenge in MySQL zu laden. Ich habe dort nachgeforscht.

Annahme

Wählen Sie aus CSV-Bibliotheken aus, die Java-Objekte mit Anmerkungen nacheinander verarbeiten können.

Ergebnis

Maven Repository: com.orangesignal » orangesignal-csv » 2.2.1 Maven Repository: com.github.mygreen » super-csv-annotation » 2.2 Maven Repository: com.univocity » univocity-parsers » 2.8.1

Unter diesen war die Super-CSV-Annotation erheblich langsamer (etwa dreimal langsamer als die anderen). OrangeSignal CSV war der schnellste.

Wenn Sie nicht entkommen müssen, war es am schnellsten, Ihre eigenen zu machen, ohne zu entkommen. ↓ Eine selbst erstellte CSV-Bibliothek, die nicht entkommen kann. NonEscapedCsvWriter/src/com/github/momosetkn/csv at master · momosetkn/NonEscapedCsvWriter

Überprüfungsmethode

Erstellt 100.000 CSVs, keine eingeschlossenen Zeichen, um das Datenvolumen zu reduzieren. Erstellt unter der Bedingung, dass es durch Kommas getrennt ist und eine Kopfzeile hat.

Ausführungsumgebung

Bestätigungscode (siehe Github)

NonEscapedCsvWriter/src/csv/test at master · momosetkn/NonEscapedCsvWriter

Daten schreiben

booleanField,localDateField,localDateTimeField,bigDecimalField,stringField,integerField,longField
true,2018-12-25,2018-12-25T09:30:10,100000.000001,1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456,2147483647,9223372036854775807
true,2018-12-25,2018-12-25T09:30:10,100000.000001,1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456,2147483647,9223372036854775807
(Alle Daten sind gleich, aber 100.000 Fälle gehen weiter ...)

Ergebnis

CSV-Bibliothek Verarbeitungszeit
OrangeSignal CSV 451.670,801ms
Selbst erstellte CSV-Bibliothek, die nicht entkommen kann 389.026,236ms
SuperCsvAnnotation 1,488.254,510ms
univocity-parsers 523.735,942ms

Hmm ... Der Datenbearbeitungsprozess ist im Vergleich zum Festplattenzugriff nicht so schwer. Ich dachte, dass sich keine der Bibliotheken auf eine Größenordnung ändern würde, SuperCsvAnnotation dauert dreimal so lange wie andere CSV-Bibliotheken ... Ich bin aus irgendeinem Grund neugierig ...

Einfallsreichtum der CSV-Bibliothek, die sich der Verarbeitung nicht entzieht

↓ Code NonEscapedCsvWriter/NonEscapedCsvWriter.java at master · momosetkn/NonEscapedCsvWriter

Geändert, um Zeichenfolgen mit StringBuilder zu kombinieren. ↓ Referenzmaterialien [String type vs StringBuilder] Unterschied in der Verarbeitungsgeschwindigkeit in der String-Kombination \ -Qiita Wie schnell ist das Schreiben beim Generieren von Zeichenfolgen in Java? \ -Qiita

Aktiviert, um zuerst die Kapazität von StringBuilder anzugeben. Sie kann vom Bibliotheksbenutzer entsprechend der erwarteten Datenmenge festgelegt werden.

Es wird nicht synchronisiert, da keine Multithread-Umgebung vorausgesetzt wird.

Obwohl es nichts mit Beschleunigung zu tun hat, habe ich es einfach gemacht, die Konvertierungslogik in eine Zeichenkette mit Lambda zu schreiben.

So verwenden Sie Ihre eigene CSV-Bibliothek, die nicht ausgeblendet wird

Oder besser Beispielcode

try(NonEscapedCsvWriter<ExampleBean> exampleBeanCsvWriter = new NonEscapedCsvWriter<>(ExampleBean.class,
                Files.newBufferedWriter(new File("/home/momose/Documents/test1_p.csv").toPath(), Charsets.UTF_8))
.charsCapacity(334)
.convert((input)-> {//Konvertierungslogik in Zeichenfolge
    if (input instanceof LocalDateTime) {
        return ((LocalDateTime) input).format(dateTimeFormatter);
    } else if (input instanceof Boolean) {
        return Boolean.TRUE.equals(input) ? "1" : "0";
    } else if (input == null) {
        return "null";
    }
    return input.toString();
})){
    exampleBeanCsvWriter.init();
    for (int i = 0; i < MAX_RECORD_COUNT; i++) {
        ExampleBean exampleBean = new ExampleBean();
        //Datenbearbeitungsprozess ...
        exampleBeanCsvWriter.write(exampleBean);
    }
};

Der Rest wird mit diesem Befehl importiert.

LOAD DATA INFILE 'example.csv' INTO TABLE scheme.table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;

Recommended Posts

Überprüfung und Implementierung der CSV-Bibliothek zum Laden großer Datenmengen in MySQL (Java)
[Details] Implementierung von Consumer-Anwendungen mit der Kinesis Client Library für Java
So löschen Sie große Datenmengen in Rails und Bedenken
Implementierung der Klonmethode für Java Record
Implementierung von DBlayer in Java (RDB, MySQL)
Flexibler Datentypkonvertierungsmechanismus der O / R-Zuordnungsbibliothek Lightsleep für Java 8
JAVA-Prozedur zum Laden von MySQL JDBC mit Eclipse
Lesen Sie den Hinweis zur Dateikopie von Java 1.7 oder höher
[Java] Über Objects.equals () und Überprüfung des String-Vergleichs (== und gleich)
Java Häufig verwendete Anweisungsliste (für Anfänger und Anfänger)