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

Entrée/Sortie Java Discussion :

Lecture et manipulation de "gros" fichiers.


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut Lecture et manipulation de "gros" fichiers.
    Bonjour à tous,

    Voici ma problématique:

    Je dois bosser sur des fichiers de type .csv avec une certaine norme.

    Pour m'aider dans ma tache, j'ai créer 2-3 classes java afin de faciliter les choses... Notamment une classe Ligne qui contient... une ligne du fichier d'origine, ainsi que diverses méthodes, et une classe Fichier, qui contient une LinkedList de Ligne et quelques autres trucs.

    Fichier me permet de manipuler mon fichier (changer une colonne, modifier telle colonne de telle ligne, enlever telle ligne, rajouter telle autre, etc...) et possède une méthode save(File sortie); qui permet de le sauvegarder là où on lui dit

    Le constucteur de Fichier ressemble à ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public Fichier(File file) throws IOException {
     
    		reader = new BufferedReader(new FileReader(file));
    		lignes = new LinkedList();
    		String buffer;
     
    		while ((buffer=reader.readLine())!=null) {
    			lignes.add(new Ligne(buffer));
    		}
     
    		reader.close();
    	}
    Donc, tout ceci, c'est bien sympa, ça me permet de manipuler le fichier comme je veux, mais j'ai a manipuler des fichiers de 200Mo des fois. Et là, j'ai une OutOfMemoryException heap size, comme vous devez vous en douter...


    La question est donc de savoir comment procéder pour que tout ceci fonctionne sans avoir a mettre un -Xmx512m par exemple...



    Merci beaucoup...

  2. #2
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    Avant de commencer j'ai deux remarques sur ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    public Fichier(File file) throws IOException {
     
    		lignes = new LinkedList();
     
    		BufferedReader reader = new BufferedReader(new FileReader(file));
    		try {
    			String buffer;
    			while ((buffer=reader.readLine())!=null) {
    				lignes.add(new Ligne(buffer));
    			}
    		} finally {
    			reader.close();
    		}
    	}

    Sinon par défaut les applications Java sont en -Xmx64m si je ne me trompe pas... donc à moins de trouver une solution miracle ce n'est pas possible de charger un fichier de 200Mo complètement en mémoire !


    Selon ce que tu fais de ces données il faudrait faire un traitement à la volée...


    a++

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut
    Merci pour le conseil du try/finally, j'aurais appris un truc aujourd'hui. (Du coup, je vais lire la FAQ sur les I/O, j'apprendrais plein de trucs)

    Sinon, concernant la solution miracle, ben c'est précisément ce que je cherche en fait

    Je tenterais bien de "bufferiser" tout ça, mais je vois pas trop comment en fait...

  4. #4
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ::Fistons Voir le message
    Je tenterais bien de "bufferiser" tout ça, mais je vois pas trop comment en fait...
    Ben tu as deux solutions :
    • Soit tu continues comme maintenant en chargeant tout en mémoire, et dans ce cas tu es obligé d'augmenter la mémoire.
    • Soit tu traites les données au moment où tu les lis sans les conserver (si c'est possible bien sûr), par exemple :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      		BufferedReader reader = new BufferedReader(new FileReader(file));
      		try {
      			String buffer;
      			while ((buffer=reader.readLine())!=null) {
      				// Traitement de buffer
      			}
      		} finally {
      			reader.close();
      		}


    a++

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Par défaut
    La deuxième solution n'est malheureusement pas possible...

    Par contre, je viens de tomber sur la classe Scanner de l'API standard, je vais peut être pouvoir en faire quelque chose... Je jette un coup d'œil et je vous dit


    Edit: Bon, il semblerait que ça suffise pas en fait... Me faudrait un mixte entre RandomAccessFile et BufferedReader...

  6. #6
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ::Fistons Voir le message
    Par contre, je viens de tomber sur la classe Scanner de l'API standard, je vais peut être pouvoir en faire quelque chose... Je jette un coup d'œil et je vous dit
    Ben le problème sera le même : si tu veux charger 200Mo en mémoire, il ta faut au moins 200Mo de mémoire...


    a++

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