Mein Programm berechnet den Hash für viele (180.000) kleine Dateien auf der Festplatte in mehreren Threads. Meine Lösung besteht darin, die Leerlaufzeit der physischen Festplatte in jedem Thread zu messen, bevor die nächste Datei gelesen wird, und zu entscheiden, ob Thread.Sleep(100) (die Festplattennutzung ist jetzt zu hoch) oder der Datei-Hash berechnet werden soll (die Festplattennutzung ist jetzt niedrig genug).
Das Problem, dass die Messung der Leerlaufzeit der physischen Festplatte etwa 1 Sekunde dauert, um korrekt zu sein.
Code: Select all
public static float GetPhysicalDiskIdleTime(string physical_disk_instance_name)
{
using (PerformanceCounter disk_idle_time_counter = new PerformanceCounter("PhysicalDisk", "% Idle Time", physical_disk_instance_name/*0 C: D:*/))
{
float first_value = disk_idle_time_counter.NextValue(); //Get the first sample (usually zero, don't know why)
Thread.Sleep(1000); //Wait for a second to get a meaningful sample
float disk_idle_time_percentage = disk_idle_time_counter.NextValue(); //This time it's normal value
return disk_idle_time_percentage;
}
}
Code: Select all
static private void ProcessQueue(object this_thread_doesnt_care_about_disk_usage) //this function executes in multiple threads
{
retry_dequeue:
if (this_thread_doesnt_care_about_disk_usage != null)
while (Entries2Check.Count > 0 && CF.GetPhysicalDiskIdleTime(PSO2PhysicalDisk) 0 && this.CurrentPhysicalDiskIdleTime 0)
goto retry_dequeue;
}

Ich habe eine rote Linie auf dem Ladediagramm gezeichnet – das ist die Festplattennutzung, die ich erwarte.

Also... Gibt es eine schnellere Möglichkeit, die Leerlaufzeit einer physischen Festplatte zu bestimmen? Oder gibt es eine Möglichkeit, das, was ich habe, zu nutzen und trotzdem eine stabile Festplattenauslastung von 95 % zu erreichen?
P.S. Wenn Sie nicht verstehen, warum ich das in mehreren Threads mache: Die Hash-Berechnung nimmt CPU-Zeit in Anspruch, und wenn das passiert, sinkt die Festplattenaktivität. Ich möchte eine angemessene Auslastung der Festplatte haben, um die Dateiprüfung so schnell wie möglich abzuschließen (es dauert bereits 4 Stunden).
Mobile version