2009-03-15 7 views
5

Die Situation ist: Es gibt eine Datei mit 14 294 508 vorzeichenlosen Ganzzahlen und 13 994 397 Gleitkommazahlen (müssen double s lesen). Die Gesamtgröße der Datei beträgt ~ 250 MB.Wie man eine schnelle formatierte Eingabe von einem Strom in C++ durchführt?

Die Verwendung von std::istream dauert ~ 30sec. Das Lesen der Daten von Datei zu Speicher (nur das Kopieren von Bytes ohne formatierte Eingabe) ist viel schneller. Gibt es eine Möglichkeit, die Lesegeschwindigkeit zu verbessern, ohne das Dateiformat zu ändern?

+0

Ich denke, Sie sollten Ihre Schleife Code – Ben

+0

Wenn dies MSVC-Bibliotheken ist, möchten Sie möglicherweise untersuchen, wie viel Strafe Sie von SECURE_SCL entstehen (standardmäßig aktiviert). Achten Sie jedoch darauf, die Auswirkungen des Ausschaltens zu verstehen. – Functastic

+0

Entschuldigung, das sollte sein: _SECURE_SCL – Functastic

Antwort

3

Müssen Sie STL-Style-I/O verwenden? Sie müssen this ausgezeichnete Arbeit von einem der Experten überprüfen. Es ist eine spezialisierte iostream von Dietmar Kuhl.

Ich hasse es, dies vorzuschlagen, aber werfen Sie einen Blick auf die C-formatierten I/O-Routinen. Liest du die ganze Datei auf einmal?

+0

Syntax und Ansatz ist egal :) Und ja, ich lese die ganze Datei. –

+0

Haben Sie fscanf und Freunde ausprobiert? Ich würde sagen, geben Sie einen Schuss und messen Sie. – dirkgently

1

Sie könnten auch an Matthew Wilson FastFormat Bibliothek aussehen wollen:

ich es nicht benutzt haben, aber er macht einige ziemlich beeindruckende Ansprüche und ich habe viel gefunden seiner anderen Arbeit lohnt es sich zu studieren und zu benutzen (und gelegentlich zu stehlen).

+0

Unterstützt es formatierte Eingabe? –

+0

Mist - Sie haben Recht ... Es ist nur Ausgabeformatierung. –

+0

Vielleicht können die Techniken auf Eingabe angewendet werden – dcw

1

Sie haben das Format nicht angegeben. Es ist möglich, dass Sie eine Speicherzuordnung vornehmen oder sehr große Abschnitte lesen und in einem Stapelalgorithmus verarbeiten können.

Sie haben auch nicht gesagt, ob Sie sicher wissen, dass die Datei und der Prozess, die es lesen, auf der gleichen Plattform sein werden. Wenn ein Big-Endian-Prozess es schreibt und ein Little-Endian-Prozess es liest oder umgekehrt, wird es nicht funktionieren.

1

Parsing Eingabe von Ihnen selbst (atoi & Atof), in der Regel erhöht die Geschwindigkeit mindestens zweimal, im Vergleich zu "universellen" Lese-Methoden.

0

etwas schnell und schmutzig ist, nur String ++ die Datei in einen Standard-C-Dump, und dann einen string auf mich aus:

#include <sstream> 
// Load file into string file_string 
std::stringstream s(file_string); 
int x; float y; 
s >> x >> y; 

Dies können Sie nicht viel von einer Leistungssteigerung (Sie werden eine bekommen größere Beschleunigung durch die Vermeidung von Iostreams), aber es ist sehr einfach zu versuchen, und es kann schneller genug sein.

Verwandte Themen