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

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    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 confirmé 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 : 38
    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
    Points : 474
    Points
    474
    Par défaut
    Waou, c'est quel genre de fichier pour qu'il fasse 10Go ???

  3. #3
    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
    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.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    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 éprouvé
    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
    Points : 935
    Points
    935
    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 du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    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
    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
    Points : 3 080
    Points
    3 080
    Par défaut
    Et avec RandomAccessFile, en faisant petits bouts par petits bouts?

  8. #8
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    En voyant ce problème, je me pose une question ( conne ) pour laquelle j'espère qu'une personne éclairée apporte la réponse.
    Les JVM officielles ( windows, linux, mac, AIX ) supportent-elles les adressages 64 bit ? J'avoue ne jamais avoir essayé et cela pourrait expliquer le soucis de zizou771. Si l'adressage se fait sur 32 bits ( 4294967296 ) - 1bit de control, cela nous fait 2147483648 soit 2Go une limite à laquelle beaucoup de logiciels sont encore restreints à l'heure actuelle.
    Ou cela vient tout simplement de l'implémentation des flux du package java.io ?

  9. #9
    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 : 41
    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
    Points : 5 943
    Points
    5 943
    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

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

  10. #10
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 840
    Points : 22 854
    Points
    22 854
    Billets dans le blog
    51
    Par défaut
    Je me pose la meme question, tous les livres que j'ai indiquent cette limitation (meme ceux sortis apres les premieres JVM 64-bits mais bon ils etaient plus centres sur la version 32-bits) et comme toutes les indexations de tableaux et de collection utilisent des int on la retrouve un peu partout dans l'API ce qui limite de facto ce que peut faire le programmeur (en acces direct, apres on peut toujours travailler "par fenetres/plages").

    Apres j'ignore si la couche native de la JVM a une correction a ce probleme pour ses addressages de memoire et acces a des flux/fichiers en iternes. Il y a peut-etre plus de doc a ce sujet sur le site de Sun.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    j'avais déjà essayé en augmentant la mémoire mais cela ne fonctionne pas.
    Par contre je vient de me rendre compte que ce n'est pas au moment de la copie de fichier que j'ai l'erreur OutOfMemoryError, c'est lorsque je recupere l'inputStream du fichier source:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    InputStream in = file.getContent().getInputStream();
    Comment faire autrement? (file est un FileObject de l'API commons-VFS)

  12. #12
    Membre éprouvé
    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
    Points : 935
    Points
    935
    Par défaut
    et du coté de commons-VFS tu as regardé FileReplicator ?

  13. #13
    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 : 41
    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
    Points : 5 943
    Points
    5 943
    Par défaut
    As-tu regardé dans la doc de l'API, peut-être y a-t-il une limitation sur la taille des fichiers.
    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

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

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    FileReplicator c'est pour faire des sauvegarde local or moi c'est pour copier d'un serveur sur un autre. Donc je manipule que des FileObject et non des File

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    dans la doc il est dit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    The input stream is buffered, so there is no need to wrap it in a BufferedInputStream.
    donc ils devrait gerer les gros fichier!!

  16. #16
    Membre éprouvé
    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
    Points : 935
    Points
    935
    Par défaut
    toujours dans la doc commons-vfs :FileUtil

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    ah merci j'avais pas vu FileUtil.
    je test et j'te dit dans 2s si ca marche

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    he non j'y est cru mais j'ai encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Exception in thread "session Task" java.lang.OutOfMemoryError: Java heap space

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

    Informations forums :
    Inscription : Avril 2005
    Messages : 197
    Points : 56
    Points
    56
    Par défaut
    une autre idée?

  20. #20
    Membre chevronné
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Points : 1 958
    Points
    1 958
    Par défaut
    C'est dégueulasse mais si c'est la seule solution... :
    Utiliser une commande système pour effectuer la copie.
    ( cp sous unix ou del/erase sous windaube )
    ?

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