none
CloseHandle von 2000 Dateien dauert 5 Minuten RRS feed

  • Allgemeine Diskussion

  • Hi,

    ich habe ein kleines Hilfsprogramm. Das hat 2000 Filehandles gleichzeitig offen, macht einiges
    damit und schließt diese am Ende zusammen.
    Das Schließen der Dateien dauert aber rund 5 Minuten.
    Für eine Schleife
    for(int i=0; i<FileHandleArray.GetSize(); ++i)
      CloseHandle(FileHandleArray[i]);
    ist das ganz schön heftig.
    Auf meinem Entwicklungs-PC dauert es auch nur 10 Sekunden.

    Der PC auf dem es laufen soll ist ein "Windows 2008 Server". Bei den Server-OS ist es
    aber wie ich glaube so, dass diese auf "Sicherheit" gebaut sind.
    So ist es wohl so, dass ohne angeschlossene USV z.B. die Schreibcaches der Festplatten
    ausgeschaltet sind.
    Der Admin sagt, dass alle Schreibcaches eingeschaltet sind. (Kann ich leider nicht prüfen.)
    Wenn ich auf meinem Entwickler-PC allerdings mit
    for(int i=0; i<FileHandleArray.GetSize(); ++i)
    {
      FlushFileBuffers(FileHandleArray[i]);
      CloseHandle(FileHandleArray[i]);
    }
    teste, dann geht auch bei mir die Laufzeit enorm in die Höhe.

    Daraus würde ich schließen, dass der Admin doch noch einen/mehrere Schreibcaches
    ausgeschaltet hat...

    Kann ich eigentlich in meiner Software sagen "Arbeite mit Cache"?
    Ich habe nur FILE_FLAG_NO_BUFFERING - also das Gegenteil - gefunden...

    Tschüß, Holger.

    • Typ geändert Ionut DumaModerator Donnerstag, 21. März 2013 15:40 Keine Ruckmeldung des Fragenstellender
    Montag, 4. März 2013 15:23

Alle Antworten

  • Kleiner Nachtrag (Zeiten gestoppt am "Server")

    Dieser Tes dauert 8 Minuten:
    2000 Dateien geöffnet (quasi sofort)
    2000 Dateien Daten aktualisiert (3 Minuten)
    2000 Dateien geschlossen (5 Minuten)

    Dieser Test dauert 3 Minuten
    2000 Dateien geöffnet (quasi sofort)
    2000 Dateien Jeweils Daten aktualisiert und Dateihandle gleich geschlossen

    D.h. wenn ich die Dateihandles sofort schließe hat es gar keine Auswirkung auf die Zeit.

    Das verstehe ich jetzt nicht - aber für meinen Bedarf funktioniert auch die zweite Variante...

    Tschüß, Holger.

    Montag, 4. März 2013 15:48
  • Hallo Holger,

    Bitte schau Dir mal folgenden Artikel http://blogs.msdn.com/b/meason/archive/2010/02/19/closehandle-hangs.aspx, was machst Du mit den Files und hast Du einige Thirdparty Apps da offen?

    Gruss,

    Ionut

    Donnerstag, 14. März 2013 10:22
    Moderator
  • Ich würde auch primär mal einen Anti-Virus-Treiber dafür verantwortlich machen.
    Wenn Du es nachvollziehen kannst, würde ich es mal mit Kernel-Debugging versuchen rauszufinden, wer dieses Verursacht.... z.B. mit "wt".


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 14. März 2013 13:29
  • Hallo Holger,

    Haben Dir unsere Antworten geholfen?

    Gruss,

    Ionut

    Dienstag, 19. März 2013 12:19
    Moderator
  • ****************************************************************************************************************
    Dieser Thread wurde mangels weiterer Beteiligung des Fragestellenden ohne bestätigte Lösung abgeschlossen.
    Neue Rückfragen oder Ergänzungen zu diesem Thread bleiben weiterhin möglich.
    ****************************************************************************************************************
    Donnerstag, 21. März 2013 15:40
    Moderator
  • Hi,

    also es gibt 2 Sachen:

    1. Siehe Link von Ionut Duma: Zusammenfassung: Dateien in einen eigenen Thread öffnen und schließen.

    2. Dein Problem kann ja gerade vom Cachen her kommen. Cachen heißt ja die Datei (zumindest ein  Teil) befindet sich im RAM, du modifizierst die und beim Schliessen schreibt er erst auf die Platte. Bei jeden Schließen wird ein Callgate zum Kernel geöffnet und der schreibt dann die Dateien.

    Jedes dieser Callgates wird einen großen Teil dieser Zeit verbrauchen...

    Vom Prinzip glaube ich wirst du bei sovielen Dateien die Zeit brauchen damit es geschlossen werden kann. Ein bisschen Performance kannst du vielleicht gewinnen wenn du es mal uncached versuchst... Am saubersten ist es aber ein eigenen Thread mit File Behandlung zu erstellen....

    Donnerstag, 28. März 2013 13:26