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:
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.
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
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part GC.Collect
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.
Bernard
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
Partager