Wie paralleles Lesen und Schreiben von Dateien

8

Ich habe ein Programm, das Daten aus zwei Textdateien liest und dann das Ergebnis in einer anderen Datei speichert. Da es viele zu lesende und zu schreibende Daten gibt, die einen Leistungseinbruch verursachen, möchte ich die Lese- und Schreiboperationen parallelisieren.

Mein erster Gedanke ist, verwende 2 Threads als Beispiel, einen Thread von Anfang an lesen / schreiben, und einen anderen Thread lesen / schreiben von der Mitte der Datei. Da meine Dateien als Zeilen und nicht als Bytes formatiert sind (jede Zeile kann unterschiedliche Datenbytes haben), funktioniert byteweise bei mir nicht. Und die Lösung, an die ich denken könnte, ist getline () zu verwenden, um die vorherigen Zeilen zuerst zu überspringen, was möglicherweise nicht effizient ist.

Gibt es eine gute Möglichkeit, nach einer bestimmten Zeile in einer Datei zu suchen? Oder haben Sie andere Ideen, um das Lesen und Schreiben von Dateien zu paral lieren?

Umgebung: Win32, C ++, NTFS, einzelne Festplatte

Danke.

-Dbger

    
Baiyan Huang 03.01.2010, 02:09
quelle

3 Antworten

18

Im Allgemeinen möchten Sie die Platten-E / A nicht parallelisieren. Festplatten mögen keine zufällige I / O, weil sie ständig suchen müssen, um zu den Daten zu gelangen. Angenommen, Sie verwenden kein RAID, und Sie verwenden Festplatten im Gegensatz zu Solid-State-Speichern, werden Sie eine starke Leistungseinbuße feststellen, wenn Sie I / O parallelisieren (selbst wenn Sie Technologien wie diese verwenden, können Sie immer noch etwas Leistung sehen) Verschlechterung bei vielen zufälligen I / O).

Um Ihre zweite Frage zu beantworten, gibt es wirklich keine gute Möglichkeit, nach einer bestimmten Zeile in einer Datei zu suchen. Sie können mit der Funktion read nur explizit nach einem Byte-Offset suchen (siehe diese Seite für) mehr Details wie man es benutzt.

    
Mike 03.01.2010, 02:12
quelle
2

Das Anhalten mehrerer Lese- und Schreibvorgänge hilft nicht, wenn Sie auf einem Datenträger ausgeführt werden. Wenn Ihre App auch eine Menge Arbeit in der CPU ausgeführt hat, könnten Sie Ihre Lese- und Schreibvorgänge asynchron ausführen und die CPU arbeiten lassen, während die Festplatten-E / A im Hintergrund auftritt. Alternativ erhalten Sie eine zweite physikalische Festplatte: lesen Sie von einem, lesen Sie den anderen. Für kleine Datenmengen ist das oft effektiv und ziemlich viel billiger als das Schreiben von Code.

    
Curt Nichols 03.01.2010 17:53
quelle
1

Dies ist nicht wirklich eine Antwort auf Ihre Frage, sondern ein Re-Design (das wir alle hassen, aber nicht helfen können). Wie bereits erwähnt, wird es wahrscheinlich nicht helfen, E / A auf einer Festplatte mit mehreren Threads zu beschleunigen.

Es könnte jedoch auch möglich sein, einen anderen Ansatz zu verwenden, abhängig von Datensensitivität, Durchsatzanforderungen, Datengröße usw. Es wäre nicht schwierig, eine Struktur im Speicher zu erstellen, die ein Bild der Daten aufrechterhält und einfache / schnelle Aktualisierungen ermöglicht der Textzeilen überall in den Daten. Sie könnten dann einen dedizierten Thread verwenden, der diese Struktur einfach überwacht und dessen Aufgabe es ist, die Daten auf die Festplatte zu schreiben. Das sequentielle Schreiben von Daten auf die Festplatte kann extrem schnell sein; es kann viel schneller sein, als zufällig nach verschiedenen Abschnitten zu suchen und es in Stücke zu schreiben.

    
Mark Wilkins 03.01.2010 16:57
quelle

Tags und Links