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

Langage Java Discussion :

OutOfMemoryError avec gros fichier


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut OutOfMemoryError avec gros fichier
    Slt,

    je veut copier le contenu d'un fichier (10G) dans un autre fichier, donc je fait comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     IOUtils.copy(is, out);  
    out.close();
    is.close();
    où 'is' est l'inputStream de mon fichier source et 'out' est l'outputStream de mon fichier cible.

    Seulement voila, dès que mon fichier source commence à faire 1G ou plus j'ai l'erreur OutOfMemoryError.

    Quelqu'un aurait une autre idée pour ne pas avoir cet erreur?

    Merci d'avance pour votre aide.

  2. #2
    Membre chevronné Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Par défaut
    Waou, c'est quel genre de fichier pour qu'il fasse 10Go ???

  3. #3
    Membre Expert
    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
    Par défaut
    Le problême provient certainement du fait que cette méthode n'utilise pas de buffer pour lire/ecrire. Regarde du coté des doc sur ce site tu trouvera ton bonheur.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    avec les buffer j'ai la meme erreur:
    j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     BufferedInputStream is = new BufferedInputStream(myInputStream);
    long l = is.available();
     
    BufferedOutputStream out = new BufferedOutputStream(myOutputStream);
    for(long i=0;i<l;i++) {
         out.write(is.read());
    }
    out.flush();
    out.close();
    is.close();
    où 'myInputStream' est l'inputStream de mon fichier source et 'myOutputStream' est l'outputStream de mon fichier cible.

  5. #5
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    essaie avec des channels:

    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
        try {
            // Create channel on the source
            FileChannel srcChannel = new FileInputStream("srcFilename").getChannel();
     
            // Create channel on the destination
            FileChannel dstChannel = new FileOutputStream("dstFilename").getChannel();
     
            // Copy file contents from source to destination
            dstChannel.transferFrom(srcChannel, 0, srcChannel.size());
     
            // Close the channels
            srcChannel.close();
            dstChannel.close();
        } catch (IOException e) {
        }

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    je ne peut pas utilisé les channel puique j'utilise commons-VFS pour acceder a des fichiers via SSH. Donc les object que je manipule sont des FileObject et non des File

  7. #7
    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
    Citation Envoyé par zizou771
    avec les buffer j'ai la meme erreur:
    j'ai fait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     BufferedInputStream is = new BufferedInputStream(myInputStream);
    long l = is.available();
     
    BufferedOutputStream out = new BufferedOutputStream(myOutputStream);
    for(long i=0;i<l;i++) {
         out.write(is.read());
    }
    out.flush();
    out.close();
    is.close();
    où 'myInputStream' est l'inputStream de mon fichier source et 'myOutputStream' est l'outputStream de mon fichier cible.
    Tout d'abord quelques remarques (qui à priori n'ont rien à voir avec ton problème).

    Première remarque, il faut fermer les fluxs dans un bloc finally.
    Deuxième remarque, pour faire ta copie utilise un buffer (byte[])
    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
    BufferedInputStream is = new BufferedInputStream(myInputStream);        
    BufferedOutputStream out = new BufferedOutputStream(myOutputStream);
    byte[] data = new byte[2048];
    int nbRead = 0;
    try {
        while((nbRead = is.read(data)) > 0) {
            out.write(data, 0, nbRead);
            out.flush();
        }
    } finally {
        try {
            out.close();
        } finally {
            is.close();
        }
    }
    Pour ton problème de mémoire regarde du coté des options -Xmx et -Xms de java
    http://java.sun.com/j2se/1.5.0/docs/.../java.html#Xms
    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

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    je suis en train de tester avec RandomAccessContent (equivalent a RandomAccessFile) et j'ai OutofMemoryError des que je veut lire dans le fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    RandomAccessContent racIn = file.getContent().getRandomAccessContent(RandomAccessMode.READ);
            RandomAccessContent racOut = flow.getContent().getRandomAccessContent(RandomAccessMode.READ);
            int tailleBuffer=5;
            byte [] tab=new byte[tailleBuffer];
            logger.info(racIn.length());//affiche 1418633216
            logger.info("!!"+racIn.getFilePointer());//affiche 0
                racIn.readByte();
    j'ai essayé de lire par tout les moyen j'ai toujours la meme erreur.
    que ce soit avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte [] tab=new byte[5];
    racIn.readFully(tab,0,4);
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    byte [] tab=new byte[5];
    racIn.readFully(tab);
    rien y fait je ne comprend pas!!

  9. #9
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    tu as essayé byte par byte avec readByte() ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    oui des le premier readByte() ca attend 4 minute et ca me met outofmemoryerror

  11. #11
    Membre émérite
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Par défaut
    Tu as regardé dans FileObject les méthodes
    - copyFrom ?
    - moveTo ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Par défaut
    copyfrom ca me fait pareil
    moveto je ne l'ai pas tester puisque, a - que j'me trompe, elle va me virer mon fichier source (ce que je ne veux pas)
    mais j'vais tester pour voir

  13. #13
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Pourquoi tu ne prends pas le code donné par iohack?

Discussions similaires

  1. [PHP 5.3] ftp curl avec gros fichier
    Par gtraxx dans le forum Langage
    Réponses: 13
    Dernier message: 10/05/2012, 10h34
  2. IndyDownloads problème avec gros fichier
    Par yvonic2010 dans le forum Composants VCL
    Réponses: 13
    Dernier message: 06/07/2011, 07h17
  3. Probleme transfert gros fichier avec webdav
    Par cybernetique dans le forum Apache
    Réponses: 1
    Dernier message: 10/05/2006, 09h53
  4. [Upload] Problème upload de gros fichiers avec Firefox
    Par the rootsm@n dans le forum Langage
    Réponses: 12
    Dernier message: 19/02/2006, 20h43
  5. Peut-on lire des gros fichiers(100k) avec "TClientSocke
    Par Fred LEM dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/12/2004, 14h41

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