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:
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:
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