Ich wollte eine große Anzahl von CSV-Dateien erstellen, um eine große Datenmenge in MySQL zu laden. Ich habe dort nachgeforscht.
Wählen Sie aus CSV-Bibliotheken aus, die Java-Objekte mit Anmerkungen nacheinander verarbeiten können.
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
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
NonEscapedCsvWriter/src/csv/test at master · momosetkn/NonEscapedCsvWriter
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 ...)
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 ...
↓ 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.
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