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

C# Discussion :

Buffer et allocation mémoire


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    71
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 71
    Par défaut Buffer et allocation mémoire
    Bonjour,

    Très gros volume à traiter.
    Au départ j'utilisais des MemoryStream (avec using ect..). Après quelques minutes j'avais un out of memory exception. J'explose la mémoire car le GC ne libère pas assez vite. Si je force le GC ça marche mais ça devient très très lent. C'est un comportement connu voir the thread par exemple

    Maintenant je réfléchi sur l'utilisation de MemoryMappedFile et MemoryMappedViewAccessor.ReadArray<T>.
    ReadArray<T> nécessite un array pour stocker le résultat et allou un nouvelle espace mémoire.

    Pour eviter d'allouer trop d'espace je voudrais pouvoir faire :

    byte[] bufferOfByte = new byte[500];

    Donc j'ai réservé 500 octets.

    et ensuite si j'ai besoin d'un autre autre tableau

    byte[] arrByte = new byte[30];

    mais que les 30 octects ne soit pas une nouvelle allocation mémoire mais adresse les 30 premiers octets de bufferOfByte.

    Est-ce possible en dotnet (c#) ?

    Merci

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Par défaut
    Bonjour,

    Tu veux avoir de la performance d'après ce que j'ai compris et tu traites des informations de + de 2 GO plus que tu arrives à faire une exception de out of memory.
    Tu connais la taille limite de ton buffer en fonction de ton architecture (32 ou 64) donc dynamiquement tu peux gérer un plusieurs memorystream en fonction de ta data.

    Je connais pas tes problématiques, mais des fois ... avec un bon DataFile il peut être intéressant de load la donnée d'un fichier car tu ne consomme pas forcément 2GO d'un seul coup ?

    Tu n'es pas arrivé au max de ton application, mais au max de ton MemoryStream

  3. #3
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    J'explose la mémoire car le GC ne libère pas assez vite. Si je force le GC ça marche mais ça devient très très lent.
    Pour résoudre ce problème, je fais appel à la procédure ci-dessous qui teste si on peut allouer un buffer de n Mégaoctets et qui appelle le garbage seulement en cas d'échec.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        internal static void CollectGarbage(int SizeToAllocateInMo)
        {
          long [,] TheArray ;
          try { TheArray =new long[SizeToAllocateInMo,125000]; }
          catch { TheArray=null ; GC.Collect() ; GC.WaitForPendingFinalizers() ; GC.Collect() ; }
          TheArray=null ;
        }

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Par défaut
    Ouep mais tes GC collect c'est couteux. Es ce que tu ne peux pas tout simplement dire buffer[N] avec N ma taille max, et ton nombre de buffer correspond à ((int)TailleTotal / N)+1 (sauf si TailleTotal % N ==0) et ensuite tu passes le bon buffer au MemoryStream suivant ce que tu as besoin de lire tout simplement.

    Car le fichier de mapping en mémoire c'est surtout pour faire du partage de mémoire entre différent processus.

    http://blogs.msdn.com/b/salvapatuel/...-in-net-4.aspx

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Ouep mais tes GC collect c'est couteux.
    C'est justement la raison our laquelle on ne les fait que quand c'est vraiment necessaire, c-à-d si on ne peut plus allouer un "grand" buffer.

Discussions similaires

  1. Pb d'allocation mémoire malloc
    Par oz80 dans le forum C++
    Réponses: 5
    Dernier message: 18/11/2005, 17h23
  2. Limite Allocation Mémoire d'un tableau d'entier
    Par l9ft b9hind dans le forum C++
    Réponses: 5
    Dernier message: 27/10/2005, 19h29
  3. Allocation mémoire
    Par DestyNov@ dans le forum C++
    Réponses: 9
    Dernier message: 23/08/2005, 08h09
  4. [Pointeur] Allocation mémoire
    Par Rayek dans le forum Langage
    Réponses: 22
    Dernier message: 20/05/2005, 10h26
  5. Allocation mémoire dynamique
    Par ITISAR dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 21/01/2005, 09h59

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