Accueil > Forum > > > > Optimiser du code prennant beacoup trop de mémoire VB.NET
Optimiser du code prennant beacoup trop de mémoire VB.NET
samedi 8 mars 2008 à 08:21:57 |
Optimiser du code prennant beacoup trop de mémoire VB.NET

dimitriusai
|
Amis programmeurs du week end, bonjour. J'ai dévelloppé une petite application qui a mes yeux semblent avoir un soucis, en effet, celle ci prend de la mémoire de facon démessurée, elle démarre à 10000ko et ne fait qu'augmenter. Le problème ne semble pas venir de la connection sql car en la commentant, cela fait le même problème. Je crois que c'est à cause des WMI, si qqun a une idée Imports System Imports System.EventArgs Imports System.Management Imports System.Threading
Public Class Service1
'Ip du serveur MySql. Dim SQL_server As String = "**********" 'User id MySql. Dim SQL_userid As String = "*******" 'User password Mysql. Dim SQL_password As String = "**************" 'Database MySql. Dim SQL_DATABASE As String = "************" Dim my_memory As Double Dim my_memory_total(4) As Double Dim my_server As String Dim my_cpu As Double Dim my_cpu_total(4) As Double Dim my_cpu_load As Double Dim my_cpu_frequency_max As Integer Dim my_cpu_frequency_use As Integer Dim boucle As String = ""
Dim VDLB_VAR As New VDLB()
Protected Overrides Sub OnStart(ByVal args() As String) Perf() ' Ajoutez ici le code pour démarrer votre service. Cette méthode doit ' démarrer votre service. End Sub
Protected Overrides Sub OnStop()
' Ajoutez ici le code pour effectuer les destructions nécessaires à l'arrêt de votre service. End Sub
Sub Perf() Do Dim i As Integer For i = 0 To 4
Try Dim searcher As New ManagementObjectSearcher( _ "root\CIMV2", _ "SELECT * FROM Win32_OperatingSystem")
For Each queryObj As ManagementObject In searcher.Get() Dim max_memory As Double = (queryObj("TotalVisibleMemorySize")) Dim available_memory As Double = (queryObj("FreePhysicalMemory")) my_memory = (1 - (available_memory / max_memory)) * 100 Next my_memory_total(i) = my_memory Catch err As ManagementException 'Console.WriteLine("An error occurred while querying for WMI data: " & err.Message) End Try
'On va rechercher la valeur de la charge du cpu
Try Dim searcher As New ManagementObjectSearcher( _ "root\CIMV2", _ "SELECT * FROM Win32_Processor") For Each queryObj As ManagementObject In searcher.Get() my_cpu_load = (queryObj("LoadPercentage")) my_cpu_frequency_max = (queryObj("MaxClockSpeed")) my_cpu_frequency_use = (queryObj("CurrentClockSpeed")) my_cpu = ((my_cpu_load * my_cpu_frequency_use) / my_cpu_frequency_max) Next my_cpu_total(i) = my_cpu Catch err As ManagementException 'Console.WriteLine("An error occurred while querying for WMI data: " & err.Message) End Try Thread.Sleep(60000)
Next i
my_memory = ((my_memory_total(0) + my_memory_total(1) + my_memory_total(2) + my_memory_total(3) + my_memory_total(4)) / 5) my_cpu = ((my_cpu_total(0) + my_cpu_total(1) + my_cpu_total(2) + my_cpu_total(3) + my_cpu_total(4)) / 5)
'On va rechercher la valeur du nom du serveur(ComputerName)
Try Dim searcher As New ManagementObjectSearcher( _ "root\CIMV2", _ "SELECT * FROM Win32_OperatingSystem") For Each queryObj4 As ManagementObject In searcher.Get() my_server = (queryObj4("CSName")) Next Catch err As ManagementException 'Console.WriteLine("An error occurred while querying for WMI data: " & err.Message) End Try
'On se connecte à la Db
Try VDLB_VAR.Connect(SQL_server, SQL_userid, SQL_password, SQL_DATABASE) Catch ex As Exception 'Console.WriteLine(ex.Message) End Try
If (VDLB_VAR.ConnectionStatus) Then
'On va rechercher la valeur de la mémoire physique disponible et la mémoire physique total, et on ressort le pourcentage utilisé par exemple 49
Try VDLB_VAR.MySQL_Query("UPDATE vdlb_perf SET memory = '" & my_memory & "' , cpu = '" & my_cpu & "' WHERE server='" + my_server + "'") VDLB_VAR.CloseClass() Catch ex As Exception 'Console.WriteLine(ex.Message) End Try Else Console.WriteLine("Erreur SQL") Thread.Sleep(300000) End If
Loop While boucle = "s" End Sub End ClassSi qqun a une idée sur la chose ? car j'ai des codes fesant 10 x cette taille là et prenant même pas 700ko en mémoire. Merci d'avance
|
|
samedi 8 mars 2008 à 09:43:04 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

jmfmarques
|
Réponse acceptée !
Bonjour,
Je ne connais rien à VB.Net.
Par instinct, toutefois :
Je libèrerais Searcher avant d'en recréer un
Tu n'as pas quelquechose, sous VB.Net, comme Searcher.Dipose ... ou set Searcher = Nothing ... ou autre chose du genre ?
|
|
samedi 8 mars 2008 à 09:47:32 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

scottmat
|
Réponse acceptée !
normalement non, mais bon tu peut l'optimiser en le déclarant qu'une fois.
et pour liberer la mémoire c'est bien dispose jmfmarques ;)
|
|
samedi 8 mars 2008 à 10:10:29 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

casy
|
Réponse acceptée !
Problèmes d'objets créer et non détruit. Pour commencer ceci : Dim i As Integer For i = 0 To 4
à chauqe tour de ta boucle Do, tu crée une variable i, qui ne te sert que dans la boucle For, la précédente n'étant pas forcément détruite. Utilise plutot ceci, ta variable i sera automatiquement marquée libérable à la fin de la boucle For For i As Integer = 0 To 4
Ensuite pour Searcher, tu crée les objets, mais jamais tu ne les détruits. Essaye peut-etre d'encadrer ton code utilisant l'objet dans un Using, l'objet créé par le using étant automatiquement détruit à la fin du Using : Using searcher As New ManagementObjectSearcher( _ "root\CIMV2", _ "SELECT * FROM Win32_Processor") For Each queryObj As ManagementObject In searcher.Get() my_cpu_load = (queryObj("LoadPercentage")) my_cpu_frequency_max = (queryObj("MaxClockSpeed")) my_cpu_frequency_use = (queryObj("CurrentClockSpeed")) my_cpu = ((my_cpu_load * my_cpu_frequency_use) / my_cpu_frequency_max) Next my_cpu_total(i) = my_cpu End Using
Si le using ne marche pas, mais simplement un searcher=Nothing juste avant le Catch Rien que ça devrai, je pense amélioré un peu les choses. Info : En .Net, la libération de la mémoire est à la charge du Garbage Collector. Elle n'est pas forcément instantanée. ---- Sevyc64 (alias Casy) ---- # LE PARTAGE EST NOTRE FORCE # [ Lien ]
|
|
samedi 8 mars 2008 à 18:29:17 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

dimitriusai
|
Merci bcp les gars, du code de vendredi soir !!! faut être indulgant. Je test cela lundi au boulot.
++ etmerci à tous
|
|
lundi 31 mars 2008 à 13:08:10 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

laurent207
|
bonjour,
J'ai le même problème que toi, mon appli qui tourne comme service windows augmante sans arrêt en mémoire.
Elle commence à 36Mo et augmante progressivement et constament. Alors j'ai lu sur des forum qu'une appli .net démarre en utilisant environ 30Mo. Donc, si la tienne prend que 20Mo c'est bien, mais augmente-t-elle en mémoire ?
laurent207
|
|
lundi 31 mars 2008 à 13:47:20 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

dimitriusai
|
Après une optimisation, comme expliquée ci dessus, et surtt l'utilisation du garbage collector, j'ai réussi à stabiliser l'utilisation mémoire à 17mo, et le logiciel tourne depuis 3 semaines sans problème et augmentation en ram.

|
|
vendredi 11 avril 2008 à 12:39:14 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

laurent207
|
est-ce que je peux voir ton code, stp.
pour chaque objet (integer, string, ping, searcher, ldap ou autre), j'ai mit une .dispose et objet=nothing, dés que j'en ai plus bessoin. J'ai aussi fait un for i as integer, mais ça na pas l'air de marcher. Maintenant au lieu de monter à 600Mo, je monte à 70Mo au bout de 2 jours.
laurent207
|
|
vendredi 11 avril 2008 à 12:42:04 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

dimitriusai
|
Fait un appel au garbage collector comme expliqué au dessus. à la fin de ta boucle System.GC.Collect()
Déso mais le code est confidentiel vu l'utilité qu'il a
|
|
vendredi 11 avril 2008 à 13:00:43 |
Re : Optimiser du code prennant beacoup trop de mémoire VB.NET

laurent207
|
pardon, j'ai oublié de dire que j'ai mit ça aussi
System.GC.Collect() System.GC.WaitForPendingFinalizers()
laurent207
|
|
Cette discussion est classée dans : end, my, total, cpu, memory
Répondre à ce message
Sujets en rapport avec ce message
Nombre de coche [ par TiteZ ]
Re bonjour,Oui oui , c'est vrai, je vous l'accorde aujourd'hui je monopolise pas mal le forum... Objectifs:je souhaite faire un tableau ( et puis apré
comment transformer le code d'une procédure sub en function ? (vba pour excell) [ par drine des iles ]
Bonjour,L'internaut jpleroisse m'a transmis ce code pour m'aider à additionner toutes les cellules d'une plage de taille variable. Comment faire pour
My.MyApplication [ par veler ]
Salut,J'ai un code que j'aimerais compilé via mon application.J'ai un petit problème avec la class MyApplication. Mon compilateur me dit que IsSingleI
vb.net paramètre sauvegarde de valeurs [ par question911 ]
Bonjour, À l'ouverture de mon petit programme il demande un numéro de série qui est 333. Dès que la personne à tapé se numéro de série une page s'ouvr
Boucler sur les cellules de droites de la ligne active [ par GarnierFlorian ]
Bonjour à tous ! Voici donc mon petit bout de code servant à calculer les totaux d'un tableaux : [code=vb]Public Sub CalculTotaux() Dim i As Lo
Récupérer les performances (CPU ET MEMORY) en vb.net [ par dimitriusai ]
Bonsoir, je suis à la recherche d'un moyen afin de récuprer la charge du cpu et la mémoire restante, afin de les intégrer dans mon programme de balanc
tri combobox [ par Fabian123 ]
Bonjour!Voila ma question:j'ai un tableau fait dans excel, trois colonnes: une avec la catégorie d'articles, une avec les articles et une avec le prix
Windows 7, ses Thumbnail Tool bars et Windows XP [ par julien2424 ]
Bonsoir à tous, Je vais poser une question qui concerne les nouvelles features de Windows 7, notamment les Thumbnail tool bars. Comme ci dessous: [im
helppppp [ par safouunette ]
Bonjour, je souhaite coller dans la 3eme feuille les lignes entieres (champ de la colonne A à I) qui ne se trouvent pas dans la feuille ws1 (je ne ve
Livres en rapport
|
Derniers Blogs
ASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHEASYNC/AWAIT: COMPRENDRE COMMENT CA MARCHE par fathi
Tout le monde est unanime pour dire que la programmation multi-thread et asynchrone est en train de devenir un sujet incontournable. Beaucoup de choses sont arrivées avec le framework 4 pour le code parallèle (TPL, PLinq,.) et bientôt, on va avoir l...
Cliquez pour lire la suite de l'article par fathi PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS !PAS D'INTELLITRACE SUR MON SITE WEB DANS IIS ! par Etienne Margraff
J'ai récemment eu un problème pour obtenir l'intelliTrace sur un site web dans IIS. Il n'y avait pas de message d'erreur, rien dans le journal d'évènement Windows, et après 3 appels à une voyante, 2 visites chez un marabou, j'ai failli me résign...
Cliquez pour lire la suite de l'article par Etienne Margraff OFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONSOFFICE 365 - SHAREPOINT ONLINE, QUELQUES LIMITATIONS par junarnoalg
De nombreuses entreprises font le choix de SharePoint Online, service fourni au travers de l'offre de Microsoft Office 365. S'il est vrai que ce choix apporte un grand nombre d'avantages; rapidité de mise en œuvre, disponibilité, large couvertu...
Cliquez pour lire la suite de l'article par junarnoalg PRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGEPRéSENTATION DES API REST DE WINDOWS AZURE : LISTER LES COMPTES DE STORAGE par richardc
http://www.c2idotnet.com/articles/presentation-des-api-rest-de-windows-azure-lister-les-comptes-de-storage
Désolé pour "toto", mais c2i existait avant blogs.developpeur.org et c'est mon site "officiel" ;-) ...
Cliquez pour lire la suite de l'article par richardc
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|