Multi-Thread-Lesen von der Festplatte?
Nehme an, dass ich Lesen muss vielen unterschiedlichen, unabhängigen Blöcken von Daten aus der gleichen Datei auf der Festplatte gespeichert.
Ist es möglich, die multi-thread-diese hochladen?
Im Zusammenhang: haben alle threads auf den gleichen Prozessor verwenden die gleiche IO-device Lesen von der Festplatte? In diesem Fall multi-threading würde nicht beschleunigen Sie das hochladen - die threads nur in der Schlange warten.
(Ich bin derzeit Multithreading mit OpenMP.)
- Können mehrere threads gleichzeitig Lesen und oft dauert es mehr als einen thread (oder Prozess) zu tun, IO, um zu sättigen die Uni-direktionaler Bandbreite. Natürlich, das Lesen von entfernten Teile einer sehr großen Datei kann (und meistens würde) machen die Festplatte Kopf ständig.
- es sei denn, das system prefetches größere Brocken.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, es ist möglich. Allerdings:
Ja. Der Lesekopf auf der Platte. Als ein Beispiel, versuchen Sie, das kopieren von zwei Dateien parallel, im Gegensatz zu Serie. Es wird wesentlich länger dauern, parallel, weil das OS verwendet scheduling-algorithmen, um sicherzustellen, dass die IO-rate ist "fair", oder gleich zwischen die zwei threads/Prozesse. Weil dieses, der Lesekopf springt hin und her zwischen den verschiedenen teilen der Festplatte, verlangsamen den Prozess sehr VIEL. Die Zeit, um tatsächlich die Daten zu Lesen, ist ziemlich klein im Vergleich zu der Zeit zu suchen, und wenn Sie Lesen sind zwei verschiedene Teile der Platte auf einmal, Sie verbringen die meiste Zeit zu suchen.
Beachten Sie, dass all dies setzt Voraus, Sie sind mit einer Festplatte.
Wenn Sie mit einer SSD, es wird nicht langsamer in parallel, aber es wird nicht schneller sein, entweder.Edit: laut Kommentaren parallel ist tatsächlich schneller für eine SSD. Mit RAID wird die situation komplizierter, und (natürlich) hängt davon ab, welche Art von RAID Sie verwenden.Dies ist, wie es aussieht (ich habe Sie ausgepackt, der kreisförmigen Scheibe in ein Rechteck, weil die ascii-Kreise sind hart, und vereinfacht das Daten-layout zu machen es leichter zu Lesen):
Übernehmen die Dateien sind getrennt durch etwas Platz auf der Platte in etwa so:
Einer Serie Lesen Aussehen (
*
zeigt an, Lesen)Während ein paralleles Lesen Aussehen wird
etc
Wenn Sie dies tun, unter Windows vielleicht möchten Sie sich in die ReadFileScatter Funktion. Es wird lassen Sie Sie Lesen mehrerer Segmente aus einer Datei in einer einzigen asynchronen Aufruf. Dies ermöglicht es dem Betriebssystem, um eine bessere Kontrolle der Datei-E /a Flaschenhals und hoffentlich optimiert das liest.
Die passenden write Aufruf auf Windows wäre WriteFileGather.
Für UNIX-suchen Sie in readv und writev, das gleiche zu tun.
readv
, man page.Wie bereits in den anderen Antworten, die ein paralleles Lesen kann langsamer sein, je nach dem wie die Datei physisch auf der Festplatte gespeichert. Also, wenn der Kopf bewegt werden muss, eine erhebliche Entfernung kann es zu einer tatsächlichen Abkühlung. Dieses Wesen sagte, es gibt jedoch storage-Systemen, die Unterstützung für mehrere gleichzeitige liest und schreibt effizient. Die einfachste die ich mir vorstellen kann ist eine SSD-Festplatte. Ich selbst arbeitete mit herrlichen storage-Systeme von IBM, die leisten konnten, die gleichzeitige lese-und Schreibvorgänge keine Verlangsamung.
Nehmen wir also an, Sie haben eine solche Datei system-und physikalischen Speicher, die wird nicht langsamer, auf der parallel liest.
In diesem Fall parallel liest sich sehr logisch. Im Allgemeinen gibt es zwei Wege zu erreichen:
Ich mich umgesetzt, die sowohl die fd - /thread-Konzept auf linux-und windows-und die ÜBERLAPPENDE Vorgehensweise unter windows. Beide funktionieren Super.
Werden Sie nicht in der Lage zu beschleunigen den Prozess der Lesen auf der Festplatte. Wenn Sie die Berechnung in der gleichen Zeit wie Sie schreiben, zu parallelisieren helfen. Aber das Reine schreiben wird begrenzt durch die Bandbreite der Gasse zwischen Prozessor und Festplatte und, mehr insbesondere, die von der Festplatte selbst (meine Festplatte hat 30 MB/s, die ich gehört habe über raid-setups portion 120 MB/s über Netzwerk, aber verlassen Sie sich nicht auf das).
Mehrere Lesevorgänge von einer Festplatte sollte thread-sicher durch die Gestaltung der op-system, wenn Sie das standard-system-Funktionen gibt es keine Notwendigkeit, manuell zu sperren, öffnen Sie die Dateien nur Lesen wenn. (Andernfalls bekommen Sie Datei-Zugriffsfehler.)
Btw sind Sie nicht notwendig zu Lesen von der Festplatte in der Praxis, das op-system wird entscheiden, wo es für Sie aus. Es in der Regel die lese-prefetches und dient aus dem Speicher.