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

JDBC Java Discussion :

[JDBC] [CSV]Problème de performance import fichiers CSV


Sujet :

JDBC Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut [JDBC] [CSV]Problème de performance import fichiers CSV
    Bonjour,

    Je travaille sous eclipse 3.1 et j'effectue un traitement java qui consiste à lire des fichiers CSV. Il y en aune vingtaine, dont certains qui pèsent 30Mo.
    Au début du traitement, j'importe ces fichiers de façon à pouvoir les manipuler ensuite. A l'exécution, rien que cet import, avant même le moindre traitement dure plus de trois heures !!!
    Je ne crois pas que ce soit normal, voici le code que j'utilise pour importer ces fichiers :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     public ImportCsv(String path) throws FileNotFoundException {
          m_fileContent = new Vector();
          FileReader fileReader = new FileReader(path);
          readFromFile(fileReader);
          fitVectorsToSize();
       }
     
     
       public ImportCsv(Reader reader) {
          m_fileContent = new Vector();
          readFromFile(reader);
          fitVectorsToSize();
       }
     
       private void fitVectorsToSize() {
          m_fileContent.setSize(getRowsCount());
          int fileSize = getRowsCount();
          int colCount = getColsCount();
          for (int i = 0; i < fileSize; i++) {
             Vector aRow = (Vector)m_fileContent.get(i);
             if (aRow == null) {
                m_fileContent.set(i, new Vector());
                aRow = (Vector)m_fileContent.get(i);
             }
             aRow.setSize(colCount);
          }
       }
     
     
       private void readFromFile(Reader reader) {
          BufferedReader buffReader = new BufferedReader(reader);
          if (buffReader != null) {
             try {
                String tempLine;
                tempLine = buffReader.readLine();
                while (tempLine != null) {
                   readFromLine(tempLine);
                   tempLine = buffReader.readLine();
                }
             } catch (IOException e) {
                System.err.println("Error reading CSV file: " + e.toString());
             } finally {
                try {
                   buffReader.close();
                } catch (IOException e) {
                   System.err.println(
                      "Erreur closing CSV file: "
                      + e.toString()
                   );
                }
             }
          }
          System.runFinalization();
          System.gc();
       }
    Avez vous des idées pour rendre ce code plus performant ?
    Cette durée d'éxécution est elle normale ??!
    Merci.


    [Modéré par Didier] : ajout de tag dans le titre - Les règles du forum Java

  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 Re: Problème de performance import fichiers CSV
    Salut,

    Citation Envoyé par PamelaGeek
    Avez vous des idées pour rendre ce code plus performant ?
    Déjà je ne vois pas la fermeture de ton FileReader dans la méthode ImportCsv...

    Puis il semblerais que tu as une méthode readFromLine(String). Mais que fais tu à l'intérieur de cette dernière ???

    Enfin je ne comprend pas trop le but de la méthode fitVectorsToSize()...
    De plus tu semble en créer un grand nombre... Il faudrait surement lui préférer ArrayList qui n'est pas synchronisé...


    Citation Envoyé par PamelaGeek
    Cette durée d'éxécution est elle normale ??!
    Non.

    As-tu déterminé quelle est la méthode qui prend le plus de temps ?

    a++

    PS : j'ai rajouté les balises [code] dans ton message, penses-y la prochaine fois

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Personnellement, j'utilise la librairie CsvJDBC pour les imports csv, elle permet de faire des requetes SQL-LIKE sur des fichier de ce format et fournit un pseudo driver jdbc qui te permettra de manipuler tes données via un ResultSet.

    ++

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  4. #4
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Dans ce genre de cas le recours à un profiler peut parfois faire gagner bcp de temps.
    Sous quel JDK travailles-tu ?
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2004
    Messages : 882
    Points : 948
    Points
    948
    Par défaut
    Citation Envoyé par zekey
    Dans ce genre de cas le recours à un profiler peut parfois faire gagner bcp de temps.
    Sous quel JDK travailles-tu ?
    Je suis d'accord tu peux utiliser le profiler de mercury (en trial uniquement)

    Sun Certified Business Component Developer
    Sun Certified Java Programmer
    --
    The definitive toolbox for GWT applications: gwt-toolbox
    My blog about Java and JEE: Benjamin's Blog

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    Merci pour vos réponses. Je viens de rebooter ma machine et le programme prend 3 minutes, je ne sais pas ce qui s'est passé hier.
    Je note néanmoins vos nombreuses pistes pour le jour où mes fichiers seront encore plus gros.

    Sinon, j'ai un problème de parsing du CSV :
    Mon séparateur est le point virgule.
    Certaines données sont des chaines de caractères entourées de guillemets. Ces chaines contiennent des points virgules qui ne doivent pas être reconnus comme des séparateurs. Ceci cause des problèmes car ma chaine de caractères est séparée en 2.

    Comment prioriser les chaines de caractères par rapport au séparateur ? Existe-il des méthodes ? Ce problème me semble assez commun non ?

    Pour info, voici le code de ma méthode readFromLine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    private void readFromLine(String tempLine) {
     
          if (tempLine == null) {
             return;
          }
          Vector currentLine = new Vector();
          m_fileContent.add(currentLine);
          m_rowsCount++;
    //      setRowsCount(getRowsCount() + 1);
          if (tempLine.trim().length() == 0) {
             return;
          }
          int colCount = 0;
          int cursorBegin = 0;
          int cursorEnd = tempLine.indexOf(CELL_SEPARATOR);
     
     
          while (cursorBegin > -1) {
             if (cursorEnd == -1) {
                currentLine.add(tempLine.substring(cursorBegin));
                cursorBegin = cursorEnd;
             } else {
                currentLine.add(tempLine.substring(cursorBegin, cursorEnd));
                cursorBegin = cursorEnd + 1;
             }
             cursorEnd = tempLine.indexOf(CELL_SEPARATOR, cursorBegin);
             colCount++;
          }
          if (colCount > getColsCount()) {
             setColsCount(Math.max(getColsCount(), colCount));
          }
     
       }

  7. #7
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Bonsoir
    Le code servant à implémenter readFromLine semble complexe.
    Pourquoi ne pas utiliser la classe StringTokenizer ou mieux avec un jdk1.4 la méthode split de String qui decoupe selon une regexp?
    Willy78

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    Bonne idée, je suis en train de regarder...(sites d'exemples bienvenus sur les patterns)
    Savez-vous comment écrire le pattern qui détecte les guillemets dans ma ligne ?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 76
    Points : 49
    Points
    49
    Par défaut
    J'ai finalement trouvé un exemple qui permet de séparer une chaine selon des espaces, sauf s'ils sont compris entre des guillemets. J'ai adapté ce code aux points virgules, qui est mon séparateur.
    J'ai perdu l'url mais je peux fournir le code si vous le demandez.

  10. #10
    Membre habitué

    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 105
    Points : 134
    Points
    134
    Par défaut
    Bonjour

    L'url serait sympa et un [resolu] aussi
    Willy78

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Import fichier CSV
    Par oki972 dans le forum SQLite
    Réponses: 5
    Dernier message: 08/10/2007, 20h58
  2. [Pb Importation fichier CSV]
    Par Jeremie_Vi dans le forum Access
    Réponses: 2
    Dernier message: 04/05/2007, 06h54
  3. Probléme import Fichier CSV
    Par wylls dans le forum Outils
    Réponses: 12
    Dernier message: 12/12/2006, 12h48
  4. Importation fichier CSV Excel
    Par @lex(is) dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 22/06/2006, 02h16
  5. Update de plusieurs tables, import fichier csv sql loader
    Par fusuke dans le forum SQL*Loader
    Réponses: 2
    Dernier message: 18/05/2006, 15h08

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