Zum Inhalt springen

Einlesen von Dateien (Speicher leeren?)


Empfohlene Beiträge

Geschrieben

Hallo Leute,

Ich programmiere momentan ein Tool, welches alle Dateien aus zwei Verzeichnissen ausliest und diese mit einander vergleicht.

Nun möchte ich die Performance verbessern. Nur habe ich dabei folgendes Problem:

Wenn ich das Einlesen das 1. mal starte braucht das Programm ca 1 Minute.

Wenn ich das Einlesen nun ein 2. mal starte braucht das Programm ca 10 Sekunden.

Ich möchte aber für Testzwecke immer wissen wie lange das Programm beim 1. Durchlauf braucht.

Ein Neu-Debuggen hilft da nicht.

Ein Neustart von Visual Studio 2005 ebenso nicht.

Ein Neustart des PC's schon.

Nur ist es etwas lästig immer den PC neuzustarten.

Kann ich den Speicher (denn ich gehe mal davon aus das sich das Programm die Dateien im Zwischenspeicher behält und es deshalb beim 2. Einlesen so schnell geht) nicht per Code (C# .Net 2.0) leeren?

Mein Programm funktioniert wie folgt:

Erstellung eines DirectoryInfo Objects vom anegegeben Pfad 1.

Rekursive Suche nach allen FileInfo Objekten

Für jedes FileInfo Object:

Erstellung eines Datei-Objektes (Datei ist eine eigene Klasse mit Eigenschaften wie Version, Größe, LastWriteDate...)

Abspeicherung des Datei-Objekts in eine List<Datei>.

Selbes Vorgehen für Pfad 2 (in eine 2. Liste natürlich)

Danach folgt der Vergleich der 2 Listen.

Nach einem 1. Googlen habe ich folgendes versucht:

Liste1= null;

Liste2= null;

System.GC.Collect();

GC.WaitForPendingFinalizers();

Und nochmal durchlaufen lassen. Jedoch friert weder meine Form1 (was ich eigentlich erwartet hätte durch GC.WaitForPendingFinalizers();noch braucht das Programm wieder so lange wie beim 1. Durchlauf.

Ich hoffe ihr könnt mir helfen,

Gruß Jeff

Geschrieben

Ersteinmal danke für die Antwort.

meine Liste hat leider keine Dispose()-Methode...

also die Liste1 bzw Liste2 sind List<Datei>-Objekte und Datei eine selbst definierte Klasse.

starte aus VS, habe jedoch gerade die Exe aus dem Debug Order gestartet....braucht ebenfalls nicht die Anfangszeit :-(

Geschrieben
(denn ich gehe mal davon aus das sich das Programm die Dateien im Zwischenspeicher behält und es deshalb beim 2. Einlesen so schnell geht)
Alternativ: Vielleicht cached das Betriebssystem (was ja auch sinnvoll wäre) an dieser Stelle?
Geschrieben
Alternativ: Vielleicht cached das Betriebssystem (was ja auch sinnvoll wäre) an dieser Stelle?

Ich werd' dem mal nachgehen (Benutze WinXP - Aber falls jemand schon weiß wie man den OS Cache leert....tut euch keinen Zwang an es mitzuteilen :))

Geschrieben
Ersteinmal danke für die Antwort.

meine Liste hat leider keine Dispose()-Methode...

starte aus VS, habe jedoch gerade die Exe aus dem Debug Order gestartet....braucht ebenfalls nicht die Anfangszeit :-(

C# - Dispose implementieren

Ersteinmal danke für die Antwort.

starte aus VS, habe jedoch gerade die Exe aus dem Debug Order gestartet....braucht ebenfalls nicht die Anfangszeit :-(

Erstell mal das Release-Build und versuche es damit.

LG,

Sebastian

Geschrieben
C# - Dispose implementieren

Ich hab mich da mal "eingearbeitet".....aber um ehrlich zu sein, verstehe ich es noch nicht so ganz. Ich habe mir mal dazu den msdn Eintrag zu IDisposable und

Implementieren einer Dispose-Methode

angeguckt.

Die sind sich ja ziemlich ähnlich....

kannst du mir sagen, ob ich das so richtig verstanden habe?

Laut msdn muss zunächst meine Klasse "Datei" von IDisposable erben.

Somit wird doch aus dem Code

void IDisposable.Dispose ()

{

   Dispose (true);

   GC.SuppressFinalize (this);

}
folgender:
void Dispose ()

{

   Dispose (true);

   GC.SuppressFinalize (this);

}
die Close-Methode kann vernachlässigt werden? Ich versteh' nich ganz was im folgenden Code mit "Ressourcen freigeben" gemeint ist.
protected virtual void Dispose (bool fDisposing)

{

   if (fDisposing) {

      // Hier die verwalteten Ressourcen freigeben

   }

   // Hier die unverwalteten Ressourcen freigeben

}
Bei MSDN steht an dieser Stelle, dass ein anfangs initialisiertes Component Objekt:
private Component component = new Component();

dort mit Dispose freigegeben wird.

Das verwirrt mich....is dieses Component Objekt jetzt in msdn ein Platzhalter für meine Klasse "Datei" ? Oder ist damit wirklich ein allgemeines Component Objekt gemeint?

Ich hoffe es macht nicht zu große Umstände mir da weiterzuhelfen :rolleyes:

Geschrieben
Das hat auch nichts mit deinem Problem zu tun, denn sonst würde es spätestens bei einem Programmneustart wieder so lange dauern wie beim ersten mal.

Das hab ich mir auch eben gedacht^^

dann wird das denk ich ma echt an Windows liegen....

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...