Schnellster Weg, um große STL-Vektoren mit STL in eine Datei zu schreiben

8

Ich habe einen großen Vektor (10 ^ 9 Elemente) von Zeichen, und ich frage mich, was der schnellste Weg ist, einen solchen Vektor in eine Datei zu schreiben. Bisher habe ich den nächsten Code benutzt:

%Vor%

Für diesen Code dauert es ungefähr zwei Minuten, um alle Daten in die Datei zu schreiben. Die eigentliche Frage ist: "Kann ich es schneller machen mit STL und wie"?

    
ljubak 07.11.2009, 13:52
quelle

7 Antworten

3

Es gibt einen kleinen konzeptionellen Fehler mit Ihrem zweiten Argument für den Konstruktor von ostream_iterator . Es sollte NULL-Zeiger sein, wenn Sie kein Trennzeichen möchten (obwohl dies glücklicherweise für Sie implizit behandelt wird), oder das zweite Argument sollte weggelassen werden.

Dies bedeutet jedoch, dass nach dem Schreiben jedes Zeichens der Code nach dem Zeiger suchen muss, der das Trennzeichen angibt (was möglicherweise ineffizient ist).

Ich denke, wenn Sie mit Iteratoren gehen wollen, könnten Sie vielleicht ostreambuf_iterator ausprobieren.

Andere Optionen können die Verwendung der write () -Methode umfassen (wenn sie die Ausgabe so groß handhaben kann, oder sie vielleicht in Chunks ausgeben) und vielleicht OS-spezifische Ausgabefunktionen.

    
UncleBens 07.11.2009, 14:05
quelle
21

Bei einer so großen Menge zu schreibender Daten (~ 1 GB) sollten Sie direkt in den Ausgabestream schreiben, anstatt einen Ausgabe-Iterator zu verwenden. Da die Daten in einem Vektor zusammenhängend gespeichert werden, wird dies funktionieren und sollte viel schneller sein.

%Vor%     
Charles Salvia 07.11.2009 16:05
quelle
2

Da Ihre Daten zusammenhängend im Speicher sind (wie Charles sagte), können Sie Low-Level-I / O verwenden. Unter Unix oder Linux können Sie in einen Dateideskriptor schreiben. Verwenden Sie unter Windows XP Dateihandles. (Es ist ein wenig schwieriger auf XP, aber in MSDN gut dokumentiert.)

XP ist ein bisschen komisch beim Puffern. Wenn Sie einen 1-GB-Block in ein Handle schreiben, ist das langsamer als wenn Sie das Schreiben in kleinere Transfergrößen (in einer Schleife) aufteilen. Ich habe festgestellt, dass die 256 KB Schreibvorgänge am effizientesten sind. Sobald Sie die Schleife geschrieben haben, können Sie damit herumspielen und sehen, was die schnellste Übertragungsgröße ist.

    
Rob deFriesse 07.11.2009 16:54
quelle
1

OK, ich habe Methodenimplementierung mit for-Schleife geschrieben, die 256KB-Blöcke (wie Rob vorgeschlagen hat) von Daten bei jeder Iteration schreibt und das Ergebnis ist 16 Sekunden, also Problem gelöst. Dies ist meine bescheidene Implementierung, also fühlen Sie sich frei zu kommentieren:

%Vor%

Danke an euch alle.

    
ljubak 07.11.2009 18:33
quelle
1

Wenn Sie eine andere Struktur haben, ist diese Methode immer noch gültig.

Zum Beispiel:

%Vor%     
tomekpe 30.05.2010 12:04
quelle
1

Anstatt über die Datei-E / A-Methoden zu schreiben, könnten Sie versuchen, eine Speicherabbilddatei zu erstellen und dann den Vektor mit memcpy in die Speicherabbilddatei zu kopieren.

    
Patrick 30.05.2010 12:08
quelle
-1

Benutze die write Methode, es ist im RAM und du hast kontigentes Gedächtnis. Schnellst, während du später nach Flexibilität suchst? Verliere die eingebaute Pufferung, zeige sequenzielle I / O, verliere die versteckten Dinge von Iterator / Utility, vermeide Streambuf, wenn du kannst, aber werde schmutzig mit boost :: asio ..

    
rama-jka toti 07.11.2009 14:06
quelle

Tags und Links