Examen et mise en œuvre de la bibliothèque CSV pour le chargement de grandes quantités de données dans MySQL (Java)

Pourquoi cet article?

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.

supposition

Faites votre choix parmi les bibliothèques CSV qui peuvent traiter les objets Java avec des annotations un par un.

résultat

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

Méthode de vérification

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

Code de vérification (voir Github)

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

Écrire des données

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 ...)

résultat

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 ...

Ingéniosité de la bibliothèque CSV qui n'échappe pas au traitement

↓ 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.

Comment utiliser votre propre bibliothèque CSV qui n'échappe pas

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

Examen et mise en œuvre de la bibliothèque CSV pour le chargement de grandes quantités de données dans MySQL (Java)
[Détails] Implémentation d'applications grand public avec Kinesis Client Library for Java
Comment supprimer de grandes quantités de données dans Rails et problèmes
Implémentation de la méthode de clonage pour Java Record
Implémentation de DBlayer en Java (RDB, MySQL)
Mécanisme de conversion de type de données flexible de la bibliothèque de mappage O / R Lightsleep pour Java 8
Procédure JAVA pour le chargement de MySQL JDBC à l'aide d'Eclipse
Consulter le mémo de la copie de fichier de Java 1.7 ou version ultérieure
[Java] À propos de Objects.equals () et examen de la comparaison de chaînes (== et égal à)
Liste des instructions Java fréquemment utilisées (pour les débutants et les débutants)