Je voulais créer un grand nombre de fichiers CSV afin de "charger des données dans un fichier" une grande quantité de données sur MySQL. J'ai enquêté là-bas.
Faites votre choix parmi les bibliothèques CSV qui peuvent traiter les objets Java avec des annotations un par un.
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
Parmi eux, Super CSV Annotation était considérablement plus lent (environ 3 fois plus lent que les autres). OrangeSignal CSV était le plus rapide.
Si vous n'avez pas besoin de vous échapper, c'était le plus rapide pour créer le vôtre sans vous échapper. ↓ Une bibliothèque CSV personnalisée qui ne s'échappe pas. NonEscapedCsvWriter/src/com/github/momosetkn/csv at master · momosetkn/NonEscapedCsvWriter
Création de 100 000 CSV, sans caractères fermés pour réduire le volume de données. Créé à la condition qu'il soit séparé par des virgules et ait un en-tête.
Environnement d'exécution
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
(Toutes les données sont les mêmes, mais 100000 continuent ...)
Bibliothèque CSV | temps de traitement |
---|---|
OrangeSignal CSV | 451.670,801ms |
Bibliothèque CSV personnalisée qui ne s'échappe pas | 389.026,236ms |
SuperCsvAnnotation | 1,488.254,510ms |
univocity-parsers | 523.735,942ms |
Hmm ... Le processus d'édition des données n'est pas si lourd par rapport à l'accès au disque, Je pensais qu'aucune des bibliothèques ne passerait à un niveau d'ordre de grandeur, SuperCsvAnnotation prend trois fois plus de temps que les autres bibliothèques CSV ... Je suis curieux pour une raison quelconque ...
↓ Code NonEscapedCsvWriter/NonEscapedCsvWriter.java at master · momosetkn/NonEscapedCsvWriter
Modifié pour combiner des chaînes à l'aide de StringBuilder. ↓ Matériaux de référence [Type de chaîne vs StringBuilder] Différence de vitesse de traitement dans la combinaison de chaînes \ -Qiita Quelle est la vitesse d'écriture lors de la génération de chaînes en Java? \ -Qiita
Activé pour spécifier d'abord la «capacité» de StringBuilder. Il peut être défini par l'utilisateur de la bibliothèque en fonction de la quantité de données attendue.
Il n'est pas synchronisé car il ne suppose pas un environnement multithread.
Bien que cela n'ait rien à voir avec l'accélération, j'ai simplifié l'écriture de la logique de conversion dans une chaîne de caractères avec lambda.
Ou plutôt un exemple de code
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)-> {//Logique de conversion en chaîne
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();
//Processus d'édition des données ...
exampleBeanCsvWriter.write(exampleBean);
}
};
Le reste est importé avec cette commande.
LOAD DATA INFILE 'example.csv' INTO TABLE scheme.table FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES;
Recommended Posts