2010-08-03 9 views
5

Was ist der beste Weg, um eine große Fließkomma-Datei in ASCII zu analysieren?Der beste Weg, um eine große Fließkomma-Datei in ASCII zu analysieren?

Was wäre der schnellste Weg, es zu tun? Ich erinnere mich, dass mir jemand gesagt hat, dass ifstream schlecht ist, weil es mit einer kleinen Anzahl von Bytes funktionierte und es besser wäre, die Datei zuerst in den Speicher einzulesen. Ist das wahr?

Bearbeiten: Ich bin auf Windows ausgeführt, und das Dateiformat ist für eine Punktwolke, die in Zeilen wie x y z r g b gespeichert wird. Ich versuche, sie in Arrays zu lesen. Auch sind die Dateien um 20   MB jeder, aber ich habe etwa 10   GB im Wert von ihnen.

Zweite Bearbeitung: Ich muss die Dateien laden, um jedes Mal anzuzeigen, wenn ich eine Visualisierung machen möchte, so wäre es schön, es so schnell wie möglich zu haben, aber ehrlich, wenn ifstream vernünftig vorformuliert, würde ich nicht Es macht mir nichts aus, mit lesbarem Code zu bleiben. Es läuft gerade ziemlich langsam, aber das könnte mehr eine Hardware-I/O-Beschränkung als alles sein, was ich in der Software tun kann, ich wollte nur bestätigen.

+0

Meinst du eine große Datei mit vielen Gleitkommazahlen? –

+0

"Beste" bedeutet nicht immer "schnellste". – strager

+1

Wie groß eine Datei? Haben Sie bereits eine Routine, die nicht schnell genug ist? –

Antwort

4

Ich denke, Ihre erste Sorge sollte sein, wie groß die Fließkommazahlen sind. Schweben sie oder können auch doppelte Daten vorhanden sein? Der traditionelle (C) Weg wäre, fscanf mit dem Format-Spezifizierer für einen Float zu verwenden, und afaik ist ziemlich schnell. Die Iostreams fügen einen kleinen Overhead in Bezug auf das Parsen der Daten hinzu, aber das ist eher vernachlässigbar. Aus Gründen der Kürze würde ich vorschlagen, dass Sie Iostreams verwenden (ganz zu schweigen von den üblichen Stream-Funktionen, die Sie damit erhalten würden).

Auch ich denke, es wird wirklich der Gemeinde helfen, wenn Sie die relevanten Zahlen zusammen mit Ihrer Frage hinzufügen könnten, wie zum Beispiel, wie groß eine Datei versuchen Sie zu analysieren? Dies ist eine Umgebung mit geringem Speicherbedarf (wie ein eingebettetes System).

0

Der schnellste Weg ist wahrscheinlich ein ifstream zu verwenden, aber Sie können auch fscanf verwenden. Wenn Sie über eine bestimmte Plattform verfügen, können Sie die Datei manuell in den Speicher laden und den Float manuell analysieren.

1

Es basiert alles auf dem Betriebssystem und der Auswahl von C und C++ - Standardbibliotheken.

Die Tage von langsamen ifstream sind ziemlich vorbei, jedoch gibt es wahrscheinlich einige Overhead in der Handhabung von C++ generischen Schnittstellen.

atof/strtod könnte der schnellste Weg sein, damit umzugehen, wenn die Zeichenfolge bereits im Speicher ist.

Schließlich ist jeder Versuch, den Sie tun würden, um die Datei in den Speicher gelesen werden, wahrscheinlich sinnlos. Moderne Betriebssysteme sind normalerweise im Weg (besonders wenn die Datei größer als RAM ist, werden Sie am Ende Code austauschen, da das System Ihre (bereits auf der Festplatte gespeicherten) Daten als austauschbar behandelt).

Wenn Sie wirklich lächerlich schnell sein müssen (Die einzigen Stellen, die ich für nützlich halte, sind HPC und Map/Reduce-basierte Ansätze) - versuchen Sie MMAP (Linux/Unix) oder MapViewOfFile, um die Datei vorab in den virtuellen Speicher zu holen in der sinnvollsten Vorgehensweise und dann atof + benutzerdefinierte String-Behandlung.

Wenn die Datei für diese Art von Spiel wirklich gut organisiert ist, können Sie sogar mit mmaps und Zeigern skurril sein und die Konvertierung Multithread haben. Klingt wie eine lustige Übung, wenn Sie über 10 GB Floats regelmäßig konvertieren müssen.