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 :

Optimiser le temps de lecture d'un gros fichier


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut Optimiser le temps de lecture d'un gros fichier
    bonjour,

    voila je suis entrain de développer une petite application et, grosso-modo, j'ai en entrée un fichier (>300MO), je fais des traitements sur le fichier puis en sortie j'ai un nouveau fichier modifier.

    mon problème est le temps d'exécution qui est considérablement grand (5h pour un fichier de 300MO). est ce que quelqu'un peut m'aider sur le sujet?

    je suis entrain de chercher sur le net mais le temps presse et je serai très reconnaissant si l'un de vous pourra me faire gagner du temps

    merci

    NB : je suis nouveau sur le forum et je vous demande de m'excuser si jamais j'ai fais une erreur ou que j'explique mal mon problème.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 540
    Par défaut
    Bonjour,

    De quel type de fichier s'agit-il ? Quels sont les traitements à faire dessus ?

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut
    le type de fichier n'est pas donné (texte, image, video, ...)

    au fait je récupère les octets du fichier en entrée un par un et je modifie chaque octet, je l'écris puis je passe au suivant

    je le traite octet par octet car si je veux récupérer tout le fichier dans un tableau j'aurai l'erreur outofmemory. je peux augmenter la taille de la JVM mais le problème c'est que ça marchera que sur ma machine et pas sur une autre.

    merci pour votre réponse et j'espère que j'étais clair

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Plutôt que de lire un octet après l'autre tu peux utiliser un buffer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    InputStream input = ...;
    byte[] buffer = new byte[4096];
    int nbRead = 0;
    while((nbRead = input.read(buffer)) > 0) {
        // traiter les octets de 0 à nbRead dans le buffer
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    86
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 86
    Par défaut
    merci pour votre réponse le y@m's

    j'ai juste une petite question le tableau buffer va contenir tout le fichier?

    car j'ai essayé de mettre tout le fichier dans un tableau de byte mais étant donné que le fichier est grand je me retrouve avec une erreur outofmemory.

    voici un extrait de mon code, espérant que cela vous aidera à trouver le problème :

    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
     
    ...
    try
            {  //Ouverture des flux e/s
                File f = new File(this.source);
                FileInputStream in = new FileInputStream(f);
                FileOutputStream os = new FileOutputStream(new File(dest));
                while(in.available()!=0)
                {
                 //Recupere le premier octet du fichier
                    next = in.read();
                    b_fichier = (byte) next;
                    next = 0;
                  //traitement sur la variable b_fichier (opération arithmétique dans une boucle for)
                    ....
                    ....
                  //Ecriture de l'octet dans le fichier de sortie
                    os.write(b_fichier);
                } 
                //Fermeture des flux
                in.close();
                os.close();
            } 
            catch (Exception e){
                System.out.println(e.toString());
            }
    voila si vous avez d'autre questions je suis la. merci

  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
    Salut,


    Non le buffer va stocker une petite partie du fichier. Pour un "petit" coût en mémoire (en général on utilise un buffer de 8192 octet) cela diminue énormément le nombre d'accès IO...


    Quelques remarques :
    • Il suffit d'utiliser un BufferedInputStream/BufferedOutputStream pour utiliser un buffer de manière totalement transparente (sans avoir rien à gérer donc).
    • Il faut utiliser les try/finally pour libérer proprement les ressources (ou le try-with-resources de Java 7)
    • N'utilises pas available() ! Non seulement son résultat n'est pas garantie mais cela implique également un accès supplémentaire au système de fichier. Il est préférable de lire le fichier jusqu'à recevoir un -1 en retour de read()
    • Ta gestion des exceptions est assez limité... Non ?


    Bref ca devrait donner quelque chose comme cela :
    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
    	try { // Ouverture des flux e/s
    		File f = new File(this.source);
    		InputStream in = new BufferedInputStream(new FileInputStream(f));
    		try {
    			OutputStream os = new BufferedOutputStream(new FileOutputStream(new File(dest)));
    			try {
     
    				while (true) {
    					int r = in.read();
    					if (r<0) break; // Fin du fichier
     
    					byte b = (byte) r;
    					// traitement sur la variable b_fichier (opération arithmétique dans une boucle for)
    					// ...
    					// Ecriture de l'octet dans le fichier de sortie
    					os.write(b);
    				}
    			} finally {
    				os.close();
    			}
    		} finally {
    			in.close();
    		}
    	} catch (Exception e) {
    		// N'y aurait-il pas mieux à faire ????
    		System.out.println(e.toString());
    	}


    Il faudrait également savoir ce que tu fais dans ta boucle for, car il est également possible que ce soit la source de ton problème : pour un fichier de 300Mo tu va exécuter cette boucle 300 000 000 fois...



    a++

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

Discussions similaires

  1. Optimisation lecture et traitement "gros" fichiers
    Par beware dans le forum Langage
    Réponses: 22
    Dernier message: 19/03/2015, 16h24
  2. [XPATH 1.0] Temps de lecture d'un "gros" fichier XML
    Par Ikki_2504 dans le forum XSL/XSLT/XPATH
    Réponses: 10
    Dernier message: 14/01/2011, 18h27
  3. Optimiser lecture d'un gros fichier
    Par n8ken dans le forum Entrée/Sortie
    Réponses: 0
    Dernier message: 17/09/2009, 11h14
  4. Lecture d'un gros fichier (jusqu a 300 Mo)
    Par Tidus159 dans le forum Entrée/Sortie
    Réponses: 13
    Dernier message: 10/04/2009, 16h57
  5. Optimisation de la lecture de tres gros fichiers
    Par Lydie dans le forum C++Builder
    Réponses: 4
    Dernier message: 12/07/2004, 14h09

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