2010-10-14 33 views
2

J'ai une énorme fuite de mémoire dans mon programme. C'est la première fois que j'utilise IronPython dans une boucle serrée, donc je me demande si cela pourrait être la cause.IronPython: Est-ce que cette fuite de mémoire?

For Each column In m_Columns 

    Dim rawValue As String 
    rawValue = line.Substring(column.FileColumnIndex.Value - 1, column.FileColumnEndIndex.Value - column.FileColumnIndex.Value + 1) 

    If column.IncludeColumnFunction <> "" Then 
     Dim scope = m_ScriptEngine.CreateScope 
     scope.SetVariable("Line", line) 
     scope.SetVariable("Row", targetRow) 
     If Not CBool(m_ScriptEngine.Execute(column.IncludeColumnFunction, scope)) Then Continue For 'skip this column 
    End If 

    targetRow(column.DatabaseColumnName) = column.ParseValue(rawValue, targetRow) 
Next 

La chaîne nommée column.IncludeColumnFunction ne change jamais pour une colonne donnée. C'est habituellement quelque chose de simple comme "Row ['Foo'] == 'Bar'". Puis-je/devrais-je mettre en cache la fonction compilée?

Est-ce que je devrais détruire la variable scope d'une certaine façon quand j'en aurai fini avec elle?

Répondre

0

Rien de particulier ne se démarque dans l'exemple de code que vous y avez placé. Je dirais qu'il est peu probable que cette partie particulière du code cause le problème (bien que plus de contexte soit nécessaire pour être définitif). Avec des fuites de mémoire, vous dépisterez le problème beaucoup plus rapidement en étudiant directement le problème ou en creusant le code. Les enquêtes directes vous diront souvent rapidement ce qui fuit et une fois que vous savez ce qui fuit, vous pouvez commencer à étudier le code qui gère ce type d'objet.

Il existe de nombreux outils et articles pour aider à dépister les problèmes de mémoire dans .Net. En voici un particulièrement bon.

+0

Outils ne me dira ce que le code fuit aujourd'hui, ils ne me disent ce qui sera un problème à l'avenir. –

+0

@ Jonathan, vous informer sur les problèmes actuels ** vous ** aidera à les éviter à l'avenir. Les devinettes aléatoires sont simplement un chemin plus lent vers cette expérience éducative. – JaredPar