Fragensteller
CloseHandle von 2000 Dateien dauert 5 Minuten

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
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 geschlossenD.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.
-
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
-
-
****************************************************************************************************************
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.
**************************************************************************************************************** -
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....