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