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

VB.NET Discussion :

Problème de gestion de mémoire


Sujet :

VB.NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut Problème de gestion de mémoire
    Bonjour

    J'ai un programme qui effectue les tâches suivantes:

    1) Lecture d'un fichier texte contenant la liste des 35000 communes de France avec leur code, département et région. Ce fichier me sert à alimenter une table dont les éléments sont une structure qui est définie de cette façon:

    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
    Structure t_commune
            Dim sNom As String
            Dim sCodeInsee As String
            Dim sCodeDépartement As String
            Dim sCodePostal As String
            Dim sNomDépartement As String
            Dim sNomRégion As String
            Dim sNomPays As String
            Dim sCodePays As String
            Dim sArrondissement As String
            Dim sCanton As String
            Dim sTAG As String
            Dim bUtilisé As Boolean 
            Dim bEcrit As Boolean
        End Structure
    2) Ensuite je lit un fichier texte de 1 000 000 de lignes dans lequel certaines lignes font références à des noms de communes. L'objectif est de détecter ces noms de communes et de les comparer à la base citée en 1 pour détecter les erreurs. Pour cela j'utilise deux tables, l'une contenant les communes erronées, l'autre celles qui n'ont pas été trouvées. Ces deux tables sont ensuite enregistrées sous forme d'un fichier texte. Au cours de ce traitement le fichier de 1 000 000 lignes est lu ligne par ligne, chaque ligne faisant l'objet ou non d'une correction puis réécrite dans un deuxième fichier.

    3) la dernière opération consiste à relire le fichier de 1 000 000 de lignes et d'y introduire les communes présentes dans le premier fichier cité en 1 mais non présent dans ce même fichier

    Lors du traitement j'ai presque à chaque fois un dépassement de mémoire.
    Je suis sous Win 8.1 avec 16Go de mémoire vive.

    J'ai essayé de surveiller l’utilisation de la mémoire et ai pu observer le suivant:

    Lors de l'étape 1 VS utilise environ 130 Mo et vshost32.exe monte à 220 Mo.
    Lors de l'étape 2 VS monte de 130 Mo à 150 Mo et vshost32.exe de 110 Mo pour monter à 650 Mo mais signale de temps en temps: "pas de réponse"
    Lors de l'étape 3 VS monte 150 Mo à Mo et vshost poursuit sa montée jusqu'à 1.3 Go avec le même "pas de réponse" ET PLANTE !!

    J'ai redimmensionné les tables dont je n'avais pas besoin à (0) et introduit une ligne
    mais sans modification dans l’utilisation de la mémoire.
    J'ai donc l'impression que c'est la lecture et l'écriture des lignes de texte qui prennent toute cette mémoire!

    A titre d'exemple et pour ne pas surcharger le message je transcrit ci dessous l'une de mes procédures.

    Merci pour votre aide.

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Sub EcrireToponymesNonUtilisés()
            'Détecter dans la base INSEE les toponymes non utilisés et les écrire dans la base Gedcom
            '
     
            Dim sNomFichierR As String = Left(OFD.FileName, InStr(OFD.FileName, ".", ) - 1) & "Tmp." & Right(OFD.FileName, Len(OFD.FileName) - InStrRev(OFD.FileName, "."))
            Dim sNomFichierW As String = Left(OFD.FileName, InStr(OFD.FileName, ".", ) - 1) & "Tmp2." & Right(OFD.FileName, Len(OFD.FileName) - InStrRev(OFD.FileName, "."))
            Dim fluxR As New StreamReader(sNomFichierR, Encoding.UTF8)
            Dim fluxW As New StreamWriter(sNomFichierW)
            Dim sLigne1 As String, sLigne2 As String, sLigne3 As String
            Dim sDéf As String
     
            Cursor.Current = Cursors.WaitCursor
            frmGestionToponymes.LBL.Visible = True
            Dim i As Integer
            Dim tc As t_commune
            'On recherche la dernière PLAC DEFN pour ensuite y insérer les toponymes disonibles dans la base INSEE
            While fluxR.Peek <> -1
                sLigne1 = fluxR.ReadLine
                frmGestionToponymes.LBL.Text = "Sauvegarde du fichier Ged : " & sLigne1
                frmGestionToponymes.LBL.Refresh()
                If Left(sLigne1, 12) = "0 _PLAC_DEFN" Then
                    'on écrit la sLigne inchangée dans le fichier temp
                    fluxW.WriteLine(sLigne1)
                    'on lit la sLigne suivante du type : "1 PLAC Dijon, 21231, Côte-d'Or, Bourgogne, France"
                    sLigne2 = fluxR.ReadLine
                    fluxW.WriteLine(sLigne2)
                    'on lit la sLigne suivante du type : "1 ABBR Dijon, 21231, Côte-d'Or, Bourgogne, France"
                    sLigne3 = fluxR.ReadLine
                    fluxW.WriteLine(sLigne3)
                ElseIf Trim(sLigne1) = "0 TRLR" Then
                    'On a atteint la fin du fichier
                    'On n'écrit rien
                Else
                    'Ce n'est pas une ligne de Toponyme, on écrit donc la ligne tel quel
                    fluxW.WriteLine(sLigne1)
                End If
     
            End While
            For i = 0 To UBound(tabCommunesInsee) - 1
                tc = tabCommunesInsee(i)
                If tc.bUtilisé = False Then
                    sDéf = StruVersDéf(tc)
                    frmGestionToponymes.LBL.Text = "Sauvegarde du fichier Ged : " & sDéf
                    frmGestionToponymes.LBL.Refresh()
                    fluxW.WriteLine("0 _PLAC_DEFN")
                    fluxW.WriteLine("1 PLAC " & sDéf)
                    fluxW.WriteLine("2 ABBR " & AbrégerLieu(tc))
                End If
            Next
            'On écrit le TAG de fin de fichier
            fluxW.WriteLine("0 TRLR")
            fluxR.Close()
            fluxW.Close()
            frmGestionToponymes.LBL.Visible = False
        End Sub
    Bernard

  2. #2
    Expert éminent 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
    Points : 7 903
    Points
    7 903
    Par défaut
    Tu pourrais essayer de forcer le garbage collector toutes les 10 000 lignes.

    GC.Collect n'est pas tout à fait suffisant. Utilise cette procedure (en c# à la base) qui permet de lancer le GC dès qu'il y a moins de n Mo dispo (avec comme paramètre n=100 par exemple).
    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 ;
         }
    Traduction auto en vb.net (non compilé, non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Friend Shared Sub CollectGarbage(ByVal SizeToAllocateInMo As Integer)
            Dim TheArray(,) As Long
            Try 
                TheArray = New Long(SizeToAllocateInMo*125000 - 1) {}
    Catch  As System.Exception
                TheArray = Nothing
                GC.Collect
                GC.WaitForPendingFinalizers
                GC.Collect
            End Try
            TheArray = Nothing
        End Sub
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 152
    Points : 57
    Points
    57
    Par défaut
    Bonjour

    Je vais essayer.

    Bernard

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

Discussions similaires

  1. Problème de gestion de mémoire ?
    Par sana_d dans le forum Langage
    Réponses: 4
    Dernier message: 08/03/2013, 23h17
  2. [Tomcat] Problème de gestion de mémoire
    Par tvcinq dans le forum Eclipse
    Réponses: 0
    Dernier message: 31/12/2009, 09h45
  3. Problème de gestion de mémoire - grosses matrices
    Par julesu dans le forum Fortran
    Réponses: 9
    Dernier message: 26/05/2008, 11h04
  4. Problème de gestion de mémoire
    Par Baud10 dans le forum MFC
    Réponses: 6
    Dernier message: 04/01/2008, 10h49
  5. Problème de gestion de mémoire (segfault)
    Par Michaël dans le forum C
    Réponses: 7
    Dernier message: 26/05/2007, 09h30

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