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

Windows Forms Discussion :

BinaryReader.Read : OutOfMemoryException


Sujet :

Windows Forms

  1. #1
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut BinaryReader.Read : OutOfMemoryException
    Bonjour à tous,

    J'ai besoin de découper un gros fichier en d'autre plus petit fichiers de 50 Mo maximum. Pour cela je lis le fichier par paquets d'octets que je stock dans un tableau de bytes. Voici une partie du code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
              Dim MyBuffer(52428800) As Byte 'tableau de byte d'un taille de 50 Mo
              MyBuffer = MyBinaryReader.ReadBytes(52428800)
    Je répète cette manip jusqu'a avoir parcouru l'ensemble du fichier. Mais au bout d'un certain temps (après avoir parcouru environ 600Mo dans le fichier il me semble) ca me génère l'exception OutOfMemoryException sur la ligne MyBuffer = MyBinaryReader.ReadBytes(52428800).

    Message d'erreur:
    Une exception de type 'System.OutOfMemoryException' a été levée.
    A quoi est due cette erreur?

    Merci d'avance

  2. #2
    Nouveau membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 36
    Points : 33
    Points
    33
    Par défaut
    je pense que c'est parce que tu gardes tous dans la mémoire, tu auras dû enregistrer le morceaux que tu as lu et puis faire en sorte qu'il n'est plus référencé pour que le GC puisses le supprimé quand ton programme est à cour de RAM

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 80
    Points : 88
    Points
    88
    Par défaut
    Tu devrait après avoir ajouter 50 mega faire un write sur ton disk, faire un close de ton buffer et recommencer avec les 50 Mo suivant. Actuellement tu arrive à saturation de ta mémoire RAM

  4. #4
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut
    C'est étrange car lors de l'execution il me reste au moins 1,5 Go de RAM libre...

    En fait dans mon programme j'extrait 50 Mo du fichier en les stockant dans mon tableau de bytes, je les envoi sur une autre machine, puis j'extrait les 50 Mo suivant pour les stocker toujours dans le même tableau de bytes (ce qui devrait écraser les données précédentes et ne pas prendre plus de place) et ainsi de suite. Le problème c'est que visiblement les données ne sont pas remplacées mais ajoutées...

    Pour bobo10 et Razielone:
    Merci beaucoup de vos réponses. Le problème c'est que je voudrais éviter de stocker les paquets de 50 Mo sur le disque car cela m'obligerais à faire 2 lectures et une écriture sur disque au lieu d'un seule lecture...

    D'autres idées?

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
              Dim MyBuffer(52428800) As Byte 'Crée un nouveau tableau de 50 Mo en mémoire
              MyBuffer = MyBinaryReader.ReadBytes(52428800)
              ' perd la référence vers le tableau, crée un nouveau tableau de 50 Mo, et le met dans MyBuffer
    ...

    Essaye avec
    Code vb : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Dim MyBuffer(52428800) As Byte 'Crée un nouveau tableau de 50 Mo en mémoire
     
    ' ...
    MyBinaryReader.ReadBytes(MyBuffer, 0, 52428800) 'lit les données dans le buffer MyBuffer en écrasant les précédentes
    Après il y a plein de problèmes avec ta méthode :
    - 50 Mo en byte[] en mémoire, cash, c'est mal. 64 Ko pour découper un fichier c'est suffisant.
    - Si ta méthode est appelée plusieurs fois et que ton buffer est déclaré comme variable locale de la fonction, chaque appel de la fonction créera un nouveau tableau de 50 Mo
    - Quand tu fait une demande de lecture avec ReadBytes de 50 Mo, si le fichier est plus court alors les derniers bytes du tableau n'auront aucun sens. Il faut utiliser la valeur de retour de ReadBytes pour savoir combien de bytes ont été lus

  6. #6
    Membre habitué Avatar de benito9253
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 205
    Points : 196
    Points
    196
    Par défaut
    Effectivement j'ai déclaré ma variable en dehors de la fonction et maintenant ca marche!!! Merci beaucoup!!!

    J'ai aussi réduit la taille du buffer car c'est vrai que c'était un peu excessif...

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

Discussions similaires

  1. memoire read
    Par rabi dans le forum OpenGL
    Réponses: 11
    Dernier message: 02/02/2004, 22h59
  2. read committed, serializable... et par défaut k'en est-il?
    Par superdada dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 01/12/2003, 18h58
  3. [LG]problème de read / readln
    Par jeremie60 dans le forum Langage
    Réponses: 7
    Dernier message: 08/06/2003, 23h33
  4. [controle] propriété read only
    Par Fizgig dans le forum Composants VCL
    Réponses: 6
    Dernier message: 28/08/2002, 10h30
  5. CheckBox en Read Only
    Par MrJéjé dans le forum C++Builder
    Réponses: 7
    Dernier message: 23/06/2002, 15h00

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