Gibt es überhaupt eine Möglichkeit, die Leerlaufzeit der physischen Festplatte zu erhalten, ohne dass eine Sekunde WarteC#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Gibt es überhaupt eine Möglichkeit, die Leerlaufzeit der physischen Festplatte zu erhalten, ohne dass eine Sekunde Warte

Post by Anonymous »

Ich versuche, ein benutzerfreundliches Programm zu entwickeln, das die physische Festplatte bei 100-prozentiger Auslastung nicht blockiert (so dass selbst das Aufrufen von „Arbeitsplatz“ etwa 10 Sekunden dauert).
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;
}
}

Fall 1 – Und wenn ich diese Funktion vor jeder Entscheidung, die nächste Datei zu verarbeiten oder nicht aufzurufen, funktioniert alles extrem langsam (fast keine CPU- und Festplattenauslastung) (natürlich muss man 1 Sekunde warten, um die Leerlaufzeit zu bestimmen).

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;
}
Fall 2 – Ich habe versucht, gemeinsam genutzte Variablen in Threads zu verwenden, anstatt CF.GetPhysicalDiskIdleTime darin aufzurufen. Das Ladebild ist besser, aber es sinkt immer noch viel auf etwa 50 % der Nutzung. Ich verstehe, warum das passiert, alles rotiert etwa 1 Sekunde Wartezeit in GetPhysicalDiskIdleTime.
Image

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

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).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post