2009-07-29 8 views
1

Ich habe einige große Dateien (von mehreren Gigabyte bis zu Hunderten von Gigabytes), die ich suche und versuche, jedes Vorkommen einer gegebenen Zeichenfolge zu finden.Bei einer parallelen Suche wird die Speicherbandbreite der begrenzende Faktor?

Ich habe versucht, dies parallel zu betreiben und einige Fragen zu haben.

  1. Wie soll ich das machen? Ich kann nicht die gesamte Datei in den Speicher kopieren, da sie zu groß ist. Funktionieren mehrere FILE * Zeiger?

  2. Wie viele Threads kann ich in die Datei einfügen, bevor die Datenträgerbandbreite zu einem begrenzenden Faktor wird und nicht zur CPU? Wie kann ich das umgehen?

Derzeit, was ich dachte, das ich 4 Threads verwenden würde, Aufgabe jeweils mit einem FILE * entweder 0%, 25%, 50% und 75% Weg durch die Datei und jeweils speichern ihre Ergebnisse zu einer Datei oder Speicher und sammeln Sie dann die Ergebnisse als letzten Schritt. Mit diesem Ansatz könnte ich jedoch, abhängig von der Bandbreite, einfach weitere Threads hinzufügen und möglicherweise eine größere Beschleunigung erzielen.

Was denkst du?

EDIT: Als ich Speicherbandbreite sagte, meinte ich eigentlich Festplatten-I/O. Das tut mir leid.

+2

Sie müssen einige schnelle Festplatten haben, wenn der Flaschenhals nicht in der Festplatten-E/A liegt. – balpha

+0

Meine Gedanken genau :) –

+0

Bandbreite (I/O oder Speicher) wird ein Engpass, wenn die Hardware nicht mithalten kann. Welche Art von hängt von der * Hardware * ab. Schick mir deinen Computer und ich teste ihn für dich. Oder Sie können es selbst auf Ihrem eigenen System versuchen, da nur so ein zuverlässiges Ergebnis erzielt werden kann. Es gibt keine allgemeine Antwort. – jalf

Antwort

6

Mit dieser neuen überarbeiteten Version der Frage lautet die Antwort "fast sofort". Festplatten können nicht sehr gut gleichzeitig von zwei Orten auf der Festplatte lesen. :) Wenn Sie mehrere Festplatten hatten und Ihre Datei auf diese Dateien aufteilen, könnten Sie wahrscheinlich etwas Threading nutzen. Um fair zu sein, würde ich jedoch sagen, dass die Plattengeschwindigkeit bereits der begrenzende Faktor ist. Ich bezweifle stark, dass Ihre Festplatte Daten schneller lesen kann als der Prozessor damit umgehen kann.

+1

Können RAID-Konfigurationen das Lesen mehrerer Sektoren nicht drastisch beschleunigen? – xtofl

+1

Ja, da eine entsprechende RAID-Konfiguration im Wesentlichen dasselbe wäre wie das Aufteilen der Datei auf mehrere Festplatten. Ich denke auch, dass Solid State Disks eine wesentliche Verbesserung darstellen, da sie aufgrund des fehlenden Dralls aus mehreren Sektoren gleichzeitig lesen können. Deshalb habe ich nach weiteren Informationen über seine Fähigkeit gefragt, seine Hardware aufzurüsten. Ich denke, dass die I/O immer noch der Flaschenhals sein würde. Prozessoren sind schnell schnell. –

1

Ich bezweifle, Speicherbandbreite wird ein so großes Problem wie Disk-IO-Einschränkungen sein. Mit der meisten Hardware werden Sie sehr eingeschränkt sein, wie jeder Thread von Festplatte lesen kann -

Wenn Sie den Durchsatz maximieren möchten, müssen Sie möglicherweise etwas tun, wie ein Thread, dessen Aufgabe es ist, Datenträger-IO (die meiste Hardware kann nur einen Block von der Platte gleichzeitig streamen, also wird das ein limitierender Faktor sein). Es kann dies dann übernehmen und Speicherbereiche an einzelne Threads in einer bestimmten Art von Thread-Pool zur Verarbeitung abschieben.

Meine Vermutung ist, dass Ihre Verarbeitung wird schnell - wahrscheinlich viel schneller als die Festplatte IO - aber wenn es langsam ist, könnte mehrere Verarbeitungs-Threads Ihren gesamten Vorgang beschleunigen.

Mehrere FILE * Zeiger funktionieren - aber möglicherweise langsamer als nur eine einzige, da sie am Ende Zeit schneiden werden, um die Datei zu lesen, und Sie werden auf Ihrer Festplatte mehr springen.

0

Wenn Sie ein SSD-Laufwerk verwenden. Sie können dieses Problem umgehen, indem Sie die Datei parallel mit mehreren Dateizeigern durchsuchen.

Verwandte Themen