2010-07-13 7 views
6

Ich frage mich nur ist parallel File.Read mit PLINQ/Parallel kann schneller sein? Mein Code ist wie folgt (.NET 4.0):ist parallele Datei.Lesen Sie schneller als Sequential Read?

public static void ReadFileParallel(List<string> fileName) 
{ 
    Parallel.Foreach(fileName, file=>File.Read(file)); 
} 

public static void ReadFilePLINQ(List<string> fileName) 
{ 
    fileName.AsParallel().foreach(file=>File.Read(file)); 
} 

Der Grund, warum ich frage dies, weil ich dachte, dass Dateilesen IO gebunden, so parallel tun wird nicht helfen, habe ich recht?

Antwort

6

Es hängt davon ab.

Wenn Ihre Dateien an verschiedenen Orten waren, auf verschiedene Netzwerkfreigaben oder auf andere physische Festplatten, dann ja, wird die parallele Laden wahrscheinlich helfen. Wenn sie sich auf einer einzelnen sich drehenden Festplatte befinden, wird das parallele Lesen der Dateien wahrscheinlich Ihre Leistung erheblich beeinträchtigen, da zusätzliche Suchzeiten wahrscheinlich von diesen parallelen Lesevorgängen verursacht werden.

Wenn Ihre Dateien auf einer SSD sind, werden Sie wahrscheinlich etwas weniger Leistung, aber es würde davon abhängen, wie viele Dateien Sie parallel gerade lesen und was ihre Größe ist. Ich stelle mir vor, dass bei einer bestimmten Größe der Dateigröße und der Anzahl paralleler Lesevorgänge die Leistung deutlich sinkt. Schwer zu sagen, ohne Experimente.

+1

Das sind vernünftige Kriterien. In der Praxis würde ich jedoch sagen, dass es eher gemessen als geschätzt wird. –

1

Sie würden denken, aber das ist nicht, was Messungen zeigen. Wenn die Datei-E/A eine signifikante Latenz hat, insbesondere über Netzwerke, kann sie parallel dazu die Pipe gefüllt halten.

0

In erster Näherung, wird es helfen, wenn die Dateien auf verschiedene Platten sind und macht es langsamer sonst (aufgrund des erhöhten Zeitaufwand sucht).

Es könnte etwas schneller sein, wenn alle Dateien zwischengespeichert werden (da Sie mehrere Kerne nutzen können).

Ihre beste Wette ist natürlich, einige Benchmarks zu laufen.

0

Sie sind nicht genau eine parallele File.Read tun, tun Sie mehrere File.Reads parallel. Wenn sich die Dateien in verschiedenen Spindeln befinden, wird der Durchsatz verbessert, wenn mehrere Spindeln gleichzeitig verwendet werden.

Sie können auch dann eine verbesserte Leistung erzielen, wenn Sie eine einzelne Spindel verwenden, wenn auf jedes Lesen eine CPU-gebundene Verarbeitung folgt, obwohl in diesem Fall Tasks-Objekte wesentlich besser geplant werden müssten. In diesem Fall können einige Aufgaben Daten aus Dateien laden, während andere bereits geladene Daten verwenden, um eine schwere Verarbeitung auszuführen.

+0

Ja, aber wenn seine Dateien auf der gleichen Festplatte sind, wird er die Suchzeit des Kopfes erreichen, und der Durchsatz wird viel schlechter als 2 Mal abnehmen. Denken Sie daran, die durchschnittliche Suchzeit für ein 3,5 "7200 RPM Laufwerk ist 13-15 Millisekunden. Und im Gegensatz zu Kapazität und lineare Lese-/Schreibrate ist diese Zahl in den letzten Jahren konsistent. – Soonts

+0

Deshalb habe ich gesagt" jeden gelesenen gefolgt von CPU-gebundene Verarbeitung. "Während ein Thread die Datei liest, führt ein anderer die Verarbeitung durch und hält so beide an. –

0

Ich denke, dass Sie hier ziemlich den Nagel auf den Kopf getroffen haben.

Parallele Operationen werden im Allgemeinen immer an dem Punkt gedrosselt, an dem Sie keine Ressourcen mehr haben, um die Operationen parallel auszuführen, aber selbst dann haben Sie immer noch abnehmende Erträge bei einer zunehmenden Anzahl paralleler Threads.

Jeff Atwood getwittert eine interessante Diagramm, das ich später noch die abnehmenden Erträge von Mutli-Core-Prozessoren mit einer Multi-Threading-Umgebung hinzufügen werde zeigt. Zugegeben, das ist nicht genau dasselbe. Aber schauen wir uns das einmal an, wenn Sie 100 Dateien auf 100 Festplatten haben, wird der IO-Kanal immer wieder auf einen einzigen Kanal zurückgesetzt, was zu einer Verringerung des Leseanstiegs führt.

Was ich im Grunde versuche zu sagen, nur etwas parallel laufen zu lassen bedeutet nicht, dass es dramatisch beschleunigt wird, es ist wichtig zu überlegen, wie die parallelen Prozesse tatsächlich ausgeführt werden.

0

Es ist knifflige Angelegenheit. Wenn Sie es falsch machen, bewegt sich der Disk-Kopf hin und her und versucht, zwei Dateien gleichzeitig zu lesen. Dies ist insbesondere ein Problem bei größeren Dateien.

Wenn Sie jedoch viele kleine Dateien parallel lesen, können Sie ein wenig gewinnen, weil das Disk-Subsystem die Dateien in einer anderen Reihenfolge lesen kann, als Sie gefragt haben. Ich habe diesen Effekt im wirklichen Leben jedoch nicht gesehen.

Auch die Bearbeitung des Inhalts kann parallel zum Lesen der Dateien erfolgen. Sie müssen also vor dem Versand ein Profil und einen Benchmark erstellen.