Was kann das sein

Hallo,

folgendes Szenario. Ich lasse einen Datentraeger, zum Bsp. HDD nach Dateien durchsuchen, die ein bestimmtest Kriterium erfuellen. Bsp. *.mp3

Nun werden sagen wir mal 7900 Files gefunden. Nach einem Klick auf einen Toolstrip Button, werden dort nun alle Informationen eingelesen und in einer Klasse abgelegt. Auf die Klassen kann man über eine Collection zugreifen.

Nun zu dem Phaenomaen, was ich nicht verstehe. Die ersten 1000 oder 1300 werden rel. schnell eingelesen. Dazu braucht das Tool gerade mal ca.4 Minuten!!! Jede Resource die belegt wird, wird sofort nach dem einlesen wieder freigegeben. Laut dem Taskmanager ändert sich kaum etwas an der Speicherauslastung.

Nachdem er aber die ca. 1000 Files eingelesen hat, wird das proggi arg langsam. Er brauch dann sicher ca.7 Minuten für die naechsten 1000 Eintraege zum einlesen.

Weiss jemand was hier schief laufen kann?

MfG Alex

Hi Alex,

Weiss jemand was hier schief laufen kann?

nur ins Blaue …

Dein Programm läuft rekursiv und Dein Stack läuft voll. Du glaubst nur, den Speicher wieder freizugeben, durch die Rekursion ist das aber tatsächlich nicht so, die Freigabe erfolgt erst nach der Schleife. Deshalb steigt das Programm auf virtual Memory um.

Warum die tatsächliche Speicherauslastung aber nicht angezeigt wird, weiß ich auch nicht.

Gruß Rainer

Hallo Rainer,

also eine unter Collection unter VB ist in .NET eine List(Of…)
Die Klasse schimpft sich Mp3Info, wo die Daten abgelegt werden.

List(Of…) hat eine Methode Add wo man nun Daten hinzufügen kann.

Im Program läuft es nun so ab

Private MyInfo as New List(of Mp3Info)
'dann die Schleife
MyInfo.Add(New(Mp3Info(...))


    
    
    Also wie du siehst liegt hier keine Rekursion vor.
    
    Was mir aber gerade aufgefallen ist, das wenn ich dann die Daten übertrage, durchlaufe ich ja MyInfo, via
    
    
    
        
        For I as Integer = to Myinfo.Count-1
        'Zugriff geschieht nun über MyInfo(i).
        Next
    
    
    
    
    Das schreiben der Datensaetze geschieht binnen 1 Minute! Also sehr schnell.
    Danach rufe ich 
    
    
    
        
        Myinfo.clear auf ' --\> Alle Eintraege werden gelöscht
        MyInfo = Nothing ' Myinfo wird ins Nirwana geschickt
    
    
    
    
    Danach bleibt aber die Speicherauslastung bei ca. 60MB stehen, wie beim suchen und einlesen. Davor ist sie bei ca. 5 MB \*gruebel\*
    
     Ich sollte vielleicht mal versuchen, na dem einlesen und vor dem schreiben noch die einzelnen Klassen zu entladen, via MyInfo(i) = Nothing. 
    Aber das hat eigentlich mit dem Problem des auslesens nichts zu tun /
    
    Zumal es unter .NET Den GC gibt ( Auf Deutsch Müllabfuhr) die nicht mehr benötigte Ressourcen automatisch wieder frei gibt ;/
    
    MfG Alex