IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

Parse du fichier CSV : Optimisation Vs. Nombres de lignes


Sujet :

Java

  1. #1
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut Parse du fichier CSV : Optimisation Vs. Nombres de lignes
    Bonjour,

    Je sollicite votre avis pour la lecture d'un fichier CSV.

    J'ai un énorme fichier CSV qui contient plus de 300.000 lignes que je suis obligé de mettre dans une liste d'objet pour faire certains traitements.

    Qu'elle est la façon la plus optimisé : gestion de mémoire et temps de lecture, pour traiter ce fichier ?

    Existe-il des API qui encapsule des algorithmes avancés et/ou optimisés pour le traitement de ce genre de type de fichier volumineux ?

    Mon objectif c'est de lire le fichier en consommant moins de mémoire JVM et dans un temps acceptable.

    Merci pour vos retours

  2. #2
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Désolé mais difficile de t'aider avec si peu d'info !

    Pourquoi as-tu besoin de mettre cela dans une liste d'objet ?
    Quels traitement dois-tu faire ?
    A quoi ressemble ton fichier CSV ? Y-a-t-il beaucoup d'info redondante dedans ?
    Quel est l'objectif final de ce traitement ?

    a++

  3. #3
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Merci pour ton retour,

    Voici la réponse à vos questions :
    Pourquoi as-tu besoin de mettre cela dans une liste d'objet ?
    Pour la modifier dans un traitement qui vient après.

    Quels traitement dois-tu faire ?
    Ce sont des données des rues et villes qui seront traitées d'une manière précises selon des règles de gestion important (je ne pourrais pas vous en dire plus).

    A quoi ressemble ton fichier CSV ? Y-a-t-il beaucoup d'info redondante dedans ?
    C'est fichier CSV qui contient des données uniques.
    Exemple :
    1;15;88;Paris;25;Ville;France;EED55;CCP98

    Quel est l'objectif final de ce traitement ?
    C'est pour répondre à un besoin spécifique de traitement des rues et villes, l'algorithme ressemble un peu à ceci :

    1. Lecture des données des fichiers
    2. Comparaison avec des tables en BD
    3. Récupération des données de la BD pour traitement
    4. En fonction des règles de gestion, en décide de mettre à jour ou sauvegarder les données en base de données.
    5. ...

    Merci par avance de votre retour

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 155
    Points : 199
    Points
    199
    Par défaut
    Citation Envoyé par aelmalki Voir le message
    Mon objectif c'est de lire le fichier en consommant moins de mémoire JVM et dans un temps acceptable.
    J'ai eu ce cas aussi.

    * Dèja, si tu sotcke des String issu de ce texte, genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] cases = ligne.split(" ");
    Ville v = new Ville(cases[3]);
    cela va garder en mémoire tout ton fichier au lieu du nom de la ville uniquement (fonctionnement des string).
    Pour corriger cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String[] cases = ligne.split(" ");
    Ville v = new Ville(new String(cases[3]));
    De plus, je remarque que Paris doit être présent un grand nombre de fois, il est donc judicieux de créer un dictionnaire temporaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Set<String> dico = new HashSet<String();
    ...
    String[] cases = ligne.split(" ");
    String nomVille = dico.get(cases[3]);
    if(nomVille == null){
      nomVille = new String(cases[3]);
      dico.add(nomVille);
    }
    Ville v = new Ville(nomVille);

    * Ensuite, si tu stocke tes nombres dans des Collections ou si tu as des Map, je te conseille d'utiliser une librairie externe plus optimisé genre apache ou FastUtil (http://fastutil.dsi.unimi.it/).

    Déjà cela devrait bien réduire l'occupation mémoire (surtout la seconde partie)

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Si le traitement est identique sur chaque lignre:

    lire une ligne,
    la traiter,
    prendre la décision de stocker ou pas
    passer à la ligne suivante.
    Minimum d'occupation mémoire.

    Si vraiment vous avez besoin de tout à la fois pour le traitement, ben comme chaque ligne fait, à vue de pif, moins de 1K sous forme d'objet, ca ne fait que 300M en mémoire, si c'est pour du traitement one shoot, je m'emerderait pas à optimiser au delà. Maintenant si ç dois tourner toutes les heures sur un serveur et qu'il ne dispose que de 64M dispo pour votre script, c'est un autre affaire

Discussions similaires

  1. [2008R2] Importation d'un fichier csv avec un nombre de colonnes variable
    Par wonderboutin123 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 10/03/2015, 12h47
  2. [RegEx] Parsing de fichier csv
    Par Khamsin dans le forum Langage
    Réponses: 2
    Dernier message: 10/02/2011, 12h13
  3. Ouvrir un fichier csv avec plus de 65535 lignes
    Par mustang-ffw02 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 09/10/2007, 20h46
  4. Réponses: 3
    Dernier message: 11/06/2007, 11h20
  5. Lecture fichier texte avec un nombre de lignes à ignorer
    Par TravelMate dans le forum Langage
    Réponses: 20
    Dernier message: 02/08/2006, 11h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo