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
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