Wie viele threads zum Lesen und schreiben auf die Festplatte?
ich entwickle eine Anwendung, die sammelt eine Liste mit allen Dateien von der Festplatte
und auch danach tut es zum schreiben von Dateien auf der Festplatte.
Möchte ich Fragen : was ist die optimale Anzahl der gleichzeitigen threads, die diese Aufgabe ausführen ?
Ich meine, wie viele threads muss ich haben, Lesen Sie die Festplatte, ohne die Festplatte
zu langsam, weil so viele threads Lesen gleichzeitig.
Danke !
- alle spezifischen Grund dafür, dass dieser Prozess, Multithreading?
- serverfault.com/questions/826163/...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich es zuerst sagen!
Es eigentlich abhängt, ob die zu lesenden Daten müssen komplexe Berechnungen für ausgearbeitet. In diesem Fall könnte es sein, bequem zu instanziieren mehr als einen thread zu erarbeiten, verschiedene Festplatten-Daten; dies ist aber nur zweckmäßig, wenn Sie mehrere CPU auf dem gleichen system.
Sonst, mehr als einen thread machen der HDD mehr Stress als nötig: gleichzeitige liest aus verschiedenen threads wird die Frage suchen Operationen für das Einlesen der Datei der Blöcke(*), die Einführung eines Overheads, könnte das system verlangsamen, abhängig von der Anzahl der Dateien zu Lesen und die Größe der Dateien.
Lesen Sie die Dateien der Reihe nach.
(*) Den OS wirklich versucht, speichern Sie die gleiche Datei-Blöcken nacheinander in der Reihenfolge, um die Geschwindigkeit der Lesevorgänge. Fragmentierung der Festplatte passiert, also nicht-sequentiell Fragmente erfordert eine seek-operation die benötigt wirklich mehr Zeit, respektieren Sie den read-Vorgang an der gleichen Stelle. Versuchen Sie, Lesen Sie mehrere Dateien parallel, dazu, dass ein paar versucht, weil die einzige Datei die Blöcke zusammenhängend sind, während Sie mehrere Dateien blockiert werden könnte, nicht zusammenhängend.
Nie Prozess IO-dichten-Operationen gleichzeitig. Es ist langsamer, weil die Festplatte Sonde verschwendet viel Zeit auf das Umschalten zwischen verschiedenen threads/Dateien.
Was soll ich tun, wenn ich ein paar threads innerhalb von IO-Operationen? Produzieren die Operationen gleichzeitig, und führen Sie die single-threaded. Wir haben einen Behälter, wie ein
ConcurrentQueue<T>
(oder eine thread-sichere queue-geschrieben von sich selbst), und es gibt 10 threads, gelesen wird aus diesen Dateien 1.txt 2.txt ... 10.txt. Setzen Sie die "lese-Anforderungen" in der Warteschlange gleichzeitig einem anderen thread behandelt alle Anfragen(offen 1.txt, bekommen, was Sie wollen, und fahren Sie mit 2.txt), die disk-Sonde wird hier nicht beschäftigt sein mit der Umschaltung zwischen threads/Dateien in diesem Fall.Einen thread. Wenn Sie Lesen UND schreiben in der gleichen Zeit, UND Ihr Ziel ist eine Platte, die sich von Ihrer Quelle, dann 2 threads. Ich werde hinzufügen, dass, wenn Sie tun, andere Operationen an den Dateien (z.B. entpacken) das Dekomprimieren Teil getan werden kann, auf einem Dritten thread.
Einige Beispiele (ich Ignoriere Abzweigungen, Analysepunkte...)
Ich arbeite auf der Annahme, dass eine Festplatte kann EINE operation zu einer Zeit, und jedes mal, wenn es "multitasks" Umschalten zwischen verschiedenen liest/schreibt, verliert es an Geschwindigkeit. Mechanische Festplatten haben dieses problem (aber technisch NCQ helfen KÖNNTE). Solid-state-Festplatten, weiß ich nicht (aber ich weiß, dass USB-sticks sind SEHR langsam, wenn Sie versuchen zu tun, 2 Operationen gleichzeitig)
Habe ich danach gesucht, wie Sie es tun... ich habe keine gefunden "konkrete" Beispiele, aber ich habe einige links zu Windows-API, wo man beginnen könnte:
Anzeigen-Volume-Pfade:
http://msdn.microsoft.com/en-us/library/cc542456%28VS.85%29.aspx
GetVolumePathName: http://msdn.microsoft.com/en-us/library/aa364996(v=VS.85).aspx
GetVolumeInformationByHandleW http://msdn.microsoft.com/en-us/library/aa964920(v=VS.85).aspx
Ich würde sagen ein thread reicht. Die CPU könnte laufen viele Fäden, aber die Geschwindigkeit der Festplatte ist um viele Größenordnungen unterhalb der CPU. Auch wenn laufen mehr Fäden aus den Anforderungen für I/O schneller (von denen ich nicht sicher bin) würde es nicht machen, die Festplatte eigentlich schneller Lesen. Es könnte wahrscheinlich sogar verlangsamen.
Wenn es kommt, aus einer einzigen HDD, dann wollen Sie minimieren die Suchzeiten. Also nur ein thread für das Lesen von und schreiben auf die Festplatte.
Als "C#" - tag bedeutet, ich bin angenommen, Sie schreiben eine verwaltete Anwendung ausführen, disk-I/O.
In diesem Fall, ich nehme an, die Anzahl der Benutzer-Ebene verwalteten threads sind irrelevant, da Sie nicht die auch tatsächlich durchführen von Platten-I/O.
Soweit ich weiß, Disk-I/O-Anfragen von der Benutzer-Ebene verwaltet threads in der Warteschlange werden in die kernel-Ebene APC-queue und windows I/O-threads, die Sie handhaben.
So, ich würde sagen, die Frequenz der disk-I/O-requests in der Warteschlange in der Warteschlange APC wird mehr relevant für Ihre Frage.
Habe ich keine gesehen .NET threading API, mit der verbindlich alle user-tasks auf Windows-I/O-threads. Beachten Sie jedoch bitte, dass meine Antwort basiert auf einer relativ alten Informationen in den folgenden link Windows-I/O-threads vs. managed-I/O-threads.
Wenn jemand weiß besser über die aktuellen Windows 7-thread-pool-Modell, die sich von den Informationen im link, bitte teilen Sie die Informationen, mich zu erziehen, als gut.
Auch finden Sie vielleicht der folgende link hilfreich zu verstehen, der windows-Datei-I/O-Operationen: Synchrone und Asynchrone I/O
Viele der Antworten beziehen sich auf die Höhe der HDDs. Beachten Sie, dass es hängt auch von der Anzahl der Controller. Manchmal zwei Festplatten verwaltet werden, die von einem einzigen controller.
Auch: zwei Partitionen auf der gleichen HDD sind nicht zwei HDDs!