Ist es möglich, threads zu beschleunigen-Datei Lesen?
Ich Lesen möchte eine Datei so schnell wie möglich (40k Zeilen) [Edit : der rest ist veraltet].
Edit: Andres Jaan Tack schlug vor, eine Lösung basierend auf einem thread pro Datei, und ich möchte sicher sein, ich habe diese (so ist dies der Schnellste Weg) :
- Ein thread pro Eintrag-Datei liest, im ganzen und die Bestände Ihrer Inhalte in einem container assoziiert (-> wie viele Container gibt es den Eintrag Dateien)
- Einem thread berechnet die lineare Kombination der in jeder Zelle Lesen von der Eingabe-threads an, und die Bestände der Ergebnisse in der exit-container (in Verbindung mit der output-Datei).
- Einem thread schreibt blockweise (alle 4 kB an Daten, also etwa 10 Zeilen) die Inhalte des output-container.
Soll ich ableiten, daß ich nicht verwenden m-mapped-Dateien (weil das Programm auf standby zu warten, für die Daten) ?
Dank aforehand.
Aufrichtig,
Mister mystère.
- Nicht jedes OS wird auch Sie starten mit 40.000 threads vor dem ausführen von out of virtual memory.
- Eine Frage, wie das macht mich Frage mich, ob Sie nähert sich dem problem der falsche Weg. Vielleicht anstatt zu versuchen, herauszufinden, wie die Datei zu Lesen, so schnell wie möglich, sollten Sie sehen, ob es einen Weg gibt, um zu vermeiden, dass die Datei zu Lesen, an alle. (Zum Beispiel, könnten Sie vielleicht die Datei-Daten bereits in den Speicher geladen, im Voraus, oder redesign Ihrer app, so dass die Datei kleiner ist oder unnötig)
- Sie können nicht Lesen 40k mal auf die Festplatte zur gleichen Zeit. Auch jeder anständige OS würden Sie einfach leugnen, die Schaffung von 40k threads und nicht zu erwähnen, dass der Versuch, so viele threads verlangsamen würde, was Sie tun wollen... macht es nicht schneller.
- Sie werden Ihre Zeit verschwenden, 40k ist nicht eine große Größe und wahrscheinlich nicht die Quelle des Engpasses. Nur profiling wird Ihnen sagen, die Quelle des Engpasses. Bis sich jemand beschwert sich über performance, Fokus auf Korrektheit und Robustheit. NICHT OPTIMIEREN, BIS SIE HABEN PROFILIERT.
- Ich wollte die Kerne relais selbst : 8 Linien im parllel, die erste zu beenden, nimmt die nächste, und so weiter. Zu wissen, dass es absolut notwendig für mich, zu Lesen, diese Dateien... Aber Andres Jaan Tack fast beantwortet meine Frage perfekt, schauen Sie unter.
InformationsquelleAutor Mister Mystère | 2010-06-16
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Frage bekam Sie ein bisschen tiefer, als Sie fragte weiter. Ich werde versuchen, decken Sie alle Ihre Optionen...
Lesen Eine - Datei: Wie viele threads?
Verwenden eine thread.
Wenn Sie gerade Lesen durch Sie eine Datei von vorn nach hinten, von einem einzelnen thread, das Betriebssystem wird nicht Holen Sie die Datei in kleine Stücke, wie Sie denken. Vielmehr wird es prefetch der Datei vor, die Sie in riesigen (exponentiell wachsende) Stücke, so dass Sie fast nie zahlen eine Strafe für den Gang auf die Festplatte. Sie könnte warten, bis die Festplatte ein paar mal, aber im Allgemeinen wird es so sein das die Datei bereits im Speicher, und dies ist sogar unabhängig von
mmap
.Des OS ist sehr gut bei dieser Art von sequentielle - Datei Lesen, weil es vorhersehbar. Wenn Sie eine Datei Lesen aus mehreren threads, sind Sie im wesentlichen das Lesen zufällig, das ist (offensichtlich) weniger vorhersehbar. Prefetcher tendenziell viel weniger effektiv mit random liest, in diesem Fall wohl dadurch, dass die gesamte Anwendung langsamer statt schneller.
Hinweis: Dies ist auch vor dem hinzufügen der Kosten für die Einrichtung des threads und all den rest. Das kostet auch etwas, aber im Grunde ist es nichts im Vergleich mit den Kosten der Sperrung der Festplatte zugreift.
Lesen von Mehreren Dateien: Wie viele threads?
Verwenden Sie so viele threads, wie man files (oder eine angemessene Anzahl).
Datei-prefetching erfolgt separat für jede geöffnete Datei. Sobald Sie beginnen, Lesen Sie mehrere Dateien haben, sollten Sie Lesen Sie aus mehrere von Ihnen parallel. Dies funktioniert, da die Festplatte I/O Scheduler werden versuchen, herauszufinden, der Schnellste, um in dem zu Lesen alle in. Oft gibt es eine disk-scheduler sowohl im OS und auf der Festplatte selbst. Inzwischen, das prefetcher können immer noch Ihre Arbeit tun.
Lesen mehrere Dateien parallel ist immer besser als das Lesen der Dateien one-by-one. Wenn Sie haben Lesen Sie ein zu einer Zeit, Ihre Festplatte würde im Leerlauf zwischen prefetches; das ist wertvolle Zeit, um mehr zu Lesen von Daten in den Speicher! Der einzige Weg, Sie können schief gehen, wenn man zu wenig RAM zur Unterstützung von many open files; das ist nicht üblich, mehr.
Ein Wort der Vorsicht: Wenn Sie zu übereifrig mit Ihren verschiedenen Datei liest, das Lesen einer Datei beginnen kicking bits von anderen Dateien aus dem Speicher, und du bist wieder um eine random-lese-situation.
Kombination n Dateien in Eine.
Verarbeitung und output erzeugt, die von mehreren threads arbeiten könnte, aber es hängt davon ab, wie Sie benötigen, Sie zu kombinieren. Sie müssen vorsichtig sein, wie Sie die Synchronisierung der threads, in jedem Fall, aber sicherlich gibt es einige relativ einfache Sperre-weniger Möglichkeiten, das zu tun.
Einer Sache zu suchen, aber: gib dir keine Mühe beim schreiben der Datei in klein (< 4K) Blöcke. Sammeln mindestens 4K-Daten rufen Sie vor
write()
. Auch, da der kernel die Datei sperren, wenn Sie es schreiben, nicht anrufenwrite()
alle Fäden zusammen; Sie müssen alle warten, bis jeder andere statt mehr Daten zu verarbeiten.[Edit: ursprüngliche Frage, ob das starten von bis zu 40.000 Fäden beschleunigen würde-Datei Lesen]
Was Sie vorschlagen, würden die meisten wahrscheinlich verlangsamen den Zugriff durch den overhead für das erzeugen von threads und den Kontextwechsel. Mehr threads helfen nur, wenn Sie
1) EDV-technisch gebunden und Sie haben zusätzliche Kerne helfen könnte, die mit der Arbeit
2) blockiert und andere threads arbeiten konnte, während der Wartezeit für andere freizugeben, um
3) Sie haben ein sehr ausgeklügelter Algorithmus, der die cache-Verhalten
Wahrscheinlich Ihre Geschwindigkeit gebunden ist, die von Festplatte und/oder memory-Bandbreite nicht rechnerische Grenzen, so dass ein einzelner Ausführungs-thread wäre in der Lage, max aus.
Ja, es ist eine Verschwendung von Zeit. Am besten werden Sie am Ende mit etwa der gleichen Leistung. Im schlimmsten Fall, es könnte weh Leistung aus der Festplatte zu suchen, um verschiedene Teile der Datei zu Lesen, anstatt durch ihn durch zu nummerieren.
Im Gegensatz zu anderen Lesern, ich glaube, dass theoretisch kann es einige benifit, auch wenn Sie auf einem SP (single-processor) system.
Aber ich würde das nie tun Sie dies so viel wie 40K Zeilen (vorausgesetzt, Sie sprechen über normal-size-Linien).
Schlüssel ist Amardeep Antwort, wo er/Sie sagt, dass das erstellen von threads ist dann sinnvoll, wenn ein thread wird blockiert aus irgendeinem Grund.
Nun, wie die zugeordneten Dateien "arbeiten"?
Wenn Sie Zugriff auf eine Speicherseite, die in dieser region für die erste Zeit - erzeugt der Prozessor einen page fault. Das OS lädt den Inhalt der Datei (dies beinhaltet den Zugriff auf die Festplatte) in den Arbeitsspeicher Seite. Dann ist die Ausführung kehrt zurück zu deinem thread.
Glaube ich auch auf Seite Fehler das OS füllt eine Reihe von aufeinander folgenden Seiten, nicht nur einzelne.
Nun, was wichtig ist, dass während der page fault processing dein thread ist ausgesetzt. Auch während dieser Zeit die CPU nicht belastet ist (abgesehen von dem, was die anderen Prozesse machen kann).
So, dass wenn man sich auf der Zeitskala, die Sie sehen, einen Zeitraum von zwei Sektionen: eine, wo die CPU geladen wird (hier Lesen Sie den Inhalt der Seite, und einige Verarbeitung), und eine, wo die CPU fast idle und die I/O auf der Festplatte durchgeführt wird.
Auf der anderen Seite können Sie erstellen, die mehrere threads, die jeweils eine zugeordnet ist, zu Lesen, einen anderen Teil der Datei. Sie profitieren von zwei Effekten:
Anderen thread eine chance hat, zu Last der CPU (oder mehrere CPUs wenn MP-system), wenn man blockiert ist, durch I/O.
Sogar im Fall, wo die Verarbeitung ist sehr kurz (daher die CPU ist nicht der Flaschenhals) - immer noch gibt ' s ein Vorteil. Es ist im Zusammenhang mit der Tatsache, dass, wenn Sie mehrere I/O auf dem gleichen physischen Gerät - es eine chance hat, führen Sie Sie effizienter zu gestalten.
Beispielsweise beim Lesen von vielen verschiedenen Sektoren von der HD-Laufwerk Sie können tatsächlich Lesen Sie alle innerhalb eines disk rotation.
P. S.
Und, natürlich, ich hätte nie gedacht, dies zu tun für 40K Zeilen. Der overhead für das erzeugen von threads, die darauf warten für Sie zu beenden -, Kontext-switches, logic complification, Fehler/Fehler-handling, etc.
Ich würde versuchen, dies zu tun für eine Datei von mindestens zig MBs.
Dies ist ein problem der Granularität. Du hast eine kleine Datei, und sehr wenig Verarbeitung zu tun. Ein thread kann wahrscheinlich verschlingen die gesamte Datei in einer Zeit, in Scheiben schneiden und verarbeiten es in die nächste. Zwei threads wäre schlimmer, als man. Sie brauchen eine viel größere Aufgabe vor Berücksichtigung der Parallelität als performance-Lösung.
Ich bin, der so denkt.
Haben Sie 8 Kerne, also 8 threads. Lassen Sie jeden thread analysieren, einen block der Datei. So müssen Sie das Gerät/Datenträger-block-Größe. Wenn ein block geparst wurde durch einen thread, lasst den thread analysiert der neue noch nicht "zugeordnet" zu einem thread.
Andere Idee, die ich haben würde, haben 2 threads. Eine parsing-thread und einen thread nur Schritt über die Datei-disk-blocks, dh nur durch das Lesen das erste byte jedes Blocks, so daß die Datei in den Arbeitsspeicher geladen werden, so schnell wie möglich.
Aber, dies könnte gemacht werden in einem Wettbewerb. Nichts zu tun echte Leben läuft! und die Menschen werden dir zeigen! 🙂 finden, der einen angemessenen Preis!