Announcement

Collapse
No announcement yet.

Multithreading und Speicherauslastung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Multithreading und Speicherauslastung

    Hallo zusammen,

    ich habe ein kleines Programm geschrieben welches mir alle Fileshares eines Fileservers ausliest. Anschließend wird von jedem Share die Größe erfasst und in eine SQL Datenbank geschrieben.

    Da es sich um sehr viele Shares handelt lese ich alle Shares aus und starte dann in einer For-Next schleife Threads in denen dann die Größe Parallel ausgelesen wird.

    Nun hatte ich das Problem das mein Arbeitsspeicher nicht mehr freigegeben wurde nachdem ein Thread beendet wurde. Um die Threads besser steuern zu können habe ich den SmartThreadPool von codeprojekt.com eingebunden.

    Nun kann ich zwar Prüfen ob alle Threads abgearbeitet wurden, aber mein Problem mit der Speicherbelastung besteht nach wie vor.

    Hier mal der Code von dem ganzen:
    [highlight=vbnet]
    Dim wigstartinfo As New Amib.Threading.WIGStartInfo()
    wigstartinfo.StartSuspended = True
    Dim test0815 As New Amib.Threading.SmartThreadPool()
    Dim wig = test0815.CreateWorkItemsGroup(100, wigstartinfo)
    c = ofs.Children
    For Each oshare In c
    Select Case oshare.Name
    Case "HOME"
    Case "user$"
    Case Else
    Dim test As String
    wig.QueueWorkItem(New Amib.Threading.WorkItemCallback(AddressOf Me.GetFolderSize), "\\FileServer\" & oshare.Name)
    End Select
    Next
    wig.Start()
    wig.WaitForIdle()
    test0815.Shutdown()

    Function GetFolderSize(ByVal state As Object)
    Try
    Dim Dirpath = CType(state, String)
    Dim size1 As Long = 0
    Dim size2 As Decimal
    Dim diBase As New DirectoryInfo(Dirpath)
    Dim files() As FileInfo
    Dim includeSubFolders As Boolean = True
    If includeSubFolders Then
    files = diBase.GetFiles("*", SearchOption.AllDirectories)
    Else
    files = diBase.GetFiles("*", SearchOption.TopDirectoryOnly)
    End If
    Dim ie As IEnumerator = files.GetEnumerator
    While ie.MoveNext
    size1 += DirectCast(ie.Current, FileInfo).Length
    End While
    size2 = Math.Round(size1 / 1024 / 1024, 2)
    SyncLock Me
    Me.dbentry(Dirpath, size2)
    End SyncLock
    Dirpath = Nothing
    size1 = Nothing
    size2 = Nothing
    diBase = Nothing
    files = Nothing
    state = Nothing
    Catch ex As Exception
    Dim DirPath As String = CStr(state(1))
    MsgBox("Error in " & DirPath & ": " & ex.Message)
    End Try
    Me.Invoke(New progressDelegate(AddressOf progress))
    Me.Invoke(New txtdelegate(AddressOf timevorraus))
    Return Nothing
    End Function
    [/highlight]
    Kann mir jemand sagen was ich falsch mache? Nach ein paar erfassten Shares bin ich bei ein paar Hundert Megabyte verbrauchtem Arbeitsspeicher, Tendenz weiter wachsend.

    Schonmal Vielen Dank

    Phil
Working...
X