fuite mémoire

fuite mémoire - VB/VBA/VBS - Programmation

Marsh Posté le 03-09-2004 à 16:33:41    

Salut,
 
j'ai un processus qui bouffe énormément de mémoire.
 
j'ai fait un script qui récupère des info sécurité sur un réseau intranet et qui enregistre le tout ligne par ligne dans des fichiers texte.
 
au début mon process fait 7.5 mo puis plus la taille du fichier txt augmente plus la mémoire utilisé augmente. genre si j'ai 20 mo et bien ca va faire 30 mo ... la derniere fois j'avais récupéré 150mo de txt. j'imagine pas a combien était monté mon process.
 
bref je penche pour un bleme avec le writeline ou qqchose comme ca.

Reply

Marsh Posté le 03-09-2004 à 16:33:41   

Reply

Marsh Posté le 04-09-2004 à 14:39:59    

c'est difficile de t'aider sans plus de précisions sur le code


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 06-09-2004 à 09:44:44    

je ne peux mettre mon code vu qu'il y a a peu pres 250 ligne mais je peux expliquer.
Dnas un premier temps je recupere la liste des pc dans le parc puis pour chacun je liste les dossiers partagés et je récupere dans un fichier txt les info de sécurité qui m'interresse sur ces dossiers sous dossiers et fichier qu'ils contiennent.
En gros un truc énorme.
 
Donc pensant que la place mémoire prise venait du fait que le fichier txt devenait de plus en plus gros j'ai décidé de fermer le fichier tous les 5 dossiers partagés, de détruire l'instance FSO puis d'en recréer un autre . Mais non.
 
Comment faire.
Je sais c pas évident mais merci tout de même.

Reply

Marsh Posté le 06-09-2004 à 10:42:51    

essaie d'isoler le problème.

Reply

Marsh Posté le 20-09-2004 à 11:49:48    

Salut,
j'ai toujours le meme probleme de processus qui bouffe de la mémoire au fur et a mesure.
je recupere mes données sur les fichiers et je les insere dans une base MySQL.
Si qq a une idée sur mon pb? :cry:

Reply

Marsh Posté le 20-09-2004 à 15:39:21    

tu ne libère pas la mémoire que tu alloues


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 21-09-2004 à 13:59:17    

mareek a écrit :

tu ne libère pas la mémoire que tu alloues


 
Et bien justement j'ai parcouru mon script et j'ai bien fait attention a faire un close puis je desalloue avec un beau nothing derriere une ouverture de fichier, de fermer les connection MySQL lorsque la requette a été exécuté. le seul hic c un objet WMI qui reste ouvert car lorque je parcours l'arborescence d'un dossier j'en ai besoin pour récupérer l'objet Folder qui sert à ressortir la collection des fichiers qu'il contient. l'objet en question c le FSO_text que j'ai crée en global puis j'alloue dans cette fonction

Code :
  1. sub Chercher_Fichier_Dossier_Dans_Partage(chemin, I, machine, nomCourant)
  2. on error resume next
  3. Dim Folder, SubFolder, File
  4.      ' Instanciation
  5.      Set Folder = FSO_text.getFolder("\\" & machine & "\" & nomCourant)
  6.      if Err<>0 Then
  7.          call Rapport_Erreur("  Une Erreur est survenue get folder" )
  8.         Err.Clear
  9.       end if
  10.       ' Incrementation de l'arborescence - dossiers
  11.       I = I + 1
  12.       ' On ne tient pas comptes des _vti, _derived, _notes (dossiers réservés à IIS),
  13.       ' Trouver la position du dernier '\' et vérifier si le caractère suivant est un _
  14.       If Mid(chemin, (Len(chemin) - Instr(StrReverse(chemin), "\" )+2),  1) <> "_" Then
  15.         ' Incrementation de l'arborescence - fichiers
  16.          I = I + 1
  17.          call secu(machine,Folder,"",nomCourant,chemin)
  18.         ' stocker tout les fichers contenu dans le répertoire courant
  19.          For Each File in Folder.Files
  20.     'recup de secu ntfs sur les fichiers contenus dans Folder
  21.     call secu(machine,Folder,File.Name,nomCourant,chemin)
  22.          Next
  23.          Set File = nothing
  24.          ' Décrémentation de l'arborescence - fichiers
  25.          I = I - 1
  26.       End If
  27.       ' Parcourir tout les sous-dossiers du dossier courant
  28.       for each SubFolder in Folder.SubFolders
  29.          ' Verifier si le dernier caractère du chemin vers le dossier
  30.          ' courant est un '\'
  31.          If Right(chemin,1) <> "\" Then
  32.     chemin = chemin & "\"
  33.          End If
  34.  If Right(nomCourant,1) <> "\" Then
  35.             nomCourant = nomCourant & "\"
  36.          End If
  37.          ' le dossier courant dans l'arbre
  38.          Call Chercher_Fichier_Dossier_Dans_Partage(chemin & SubFolder.Name, I, machine, nomCourant & SubFolder.Name)
  39.          ' Décrémentation de l'arborescence
  40.          I = I - 1
  41.          ' Prochain
  42.       Next
  43.       'Destruction des instances
  44.       Set SubFolder = nothing
  45.       Set Folder = Nothing
  46.       if Err<>0 Then
  47.          call Rapport_Erreur("  Une Erreur est survenue lors du parcours des fichiers partagés" )
  48.         Err.Clear
  49.       end if
  50. end sub


bon voila si ca peut vous aider à m'aider


Message édité par Toby14 le 23-09-2004 à 10:33:38
Reply

Marsh Posté le 21-09-2004 à 20:55:48    

Si il y a un pb de fuite mémoire, je ne crois pas qu'il soit dans cette fonction. pourrais tu poster le code de la foction secu() ?


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
Reply

Marsh Posté le 23-09-2004 à 10:29:06    

Code :
  1. '--------------------------------------------------------------------------------
  2. 'recupere les parametre de sécurité des dossiers ou fichiers passé en parametres
  3. 'puis écrit dans un fichier txt
  4. sub secu(machine, dossier, nomFichier, nomCourant, chemin)
  5.     on error resume next
  6.     dim ObjSet, refItem
  7.     if nomFichier = "" Then
  8.        Set ObjSet = GetObject("WinMgmts:{impersonationLevel=impersonate}!\\" & machine & "\root\cimv2:Win32_LogicalFileSecuritySetting='" & chemin & "'" )
  9.     else
  10.      If Right(chemin,1) <> "\" Then
  11.            chemin = chemin & "\"
  12.         End If
  13.      Set ObjSet = GetObject("WinMgmts:{impersonationLevel=impersonate}!\\" & machine & "\root\cimv2:Win32_LogicalFileSecuritySetting='" & chemin & nomFichier & "'" )
  14.     end if
  15.    
  16.     if Err<>0 then
  17.        call Rapport_Erreur("  erreur lors de l'appel au service wmi sur " & nomCourant & "\" & nomFichier & " surement du a une apostrophe" )
  18.        Err.clear
  19.        call insert_donnees(machine, nomFichier, chemin, "PB apostrophe", "voir directement", "le fichier" )
  20.     end if
  21.    
  22.     If ObjSet.GetSecurityDescriptor(refSD) = 0 Then
  23.        'call insert_donnees(machine, nomCourant,ObjSet.Path, refSD.Owner.Name,"", "" )
  24.        for each refItem In refSD.DACL
  25.            if nomFichier = "" then
  26.               Dim nouveauNomCourant
  27.             nouveauNomCourant = "\" & nomCourant
  28.             nouveauNomCourant = Mid(nouveauNomCourant,Len(nouveauNomCourant) - (Instr(StrReverse(nouveauNomCourant), "\" ))+2, Len(nouveauNomCourant))
  29.             call insert_donnees(machine, nouveauNomCourant, ObjSet.Path, refSD.Owner.Name, refItem.Trustee.Name, decodeAccessMask(refItem.AccessMask))
  30.            else
  31.               call insert_donnees(machine, nomFichier, ObjSet.Path, refSD.Owner.Name, refItem.Trustee.Name, decodeAccessMask(refItem.AccessMask))
  32.            end if
  33.        next
  34.        Set refSD = nothing
  35.        Set refItem = nothing
  36.     end if
  37.     if Err<>0 Then
  38.        call Rapport_Erreur("  Erreur dans la recheche Secu de " & nomCourant & " " & nomFichier & " path: " & ObjSet.Path)
  39.        Err.Clear
  40.     end if
  41.     Set ObjSet = nothing
  42.     nomFichier =""
  43. end sub


 
voici secu.
menfin je crois pas non plus qu'il y ait de fuite mémoire en fait.
Simplement vue que je fait du récursif, les boucle for s'embriquent.  
Sinon j'aurais pu faire de l'itératif et gérer une pile ou une file, mais j'aurais une pile énorme et donc cela prendrais aussi beaucoup de mémoire. Mais sans oute moins que d'embriquer des boucles for.


Message édité par Toby14 le 23-09-2004 à 10:33:02
Reply

Marsh Posté le 11-08-2015 à 19:39:39    

bonjour, j'ai eut le même problème et j'ai trouvé la solution sur un autre forum un enregistrement régulier de ton fichier permet de contenir ta mémoire.

Reply

Marsh Posté le 11-08-2015 à 19:39:39   

Reply

Marsh Posté le 12-08-2015 à 06:39:47    

Salut, pas mal comme déterrage pour un Post du 23-09-2004 ( 11 ans )


Message édité par kiki29 le 12-08-2015 à 06:40:07

---------------
Myanmar 90/91 : http://gadaud.gerard.free.fr/publi [...] index.html
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed