Frage

Was ist der beste Weg, um eine große Floating-Point-Datei in ASCII gespeichert zu analysieren?

Was wäre der schnellste Weg, es zu tun? Ich erinnere mich an mich jemand sagen, mit ifstream schlecht war, weil es auf eine kleine Anzahl von Bytes gearbeitet, und es wäre besser, nur die Datei zunächst in dem Speicher gelesen. Ist das wahr?

Edit: Ich bin auf Windows läuft, und das Dateiformat ist für eine Punktwolke, die in Reihen wie x y z r g b gespeichert ist. Ich versuche, sie in Arrays zu lesen. Außerdem sind die Dateien etwa 20 MB je, aber ich habe rund 10 GB im Wert von ihnen.

Zweiter edit: Ich werde die Dateien haben, zu laden jedes Mal, wenn ich eine Visualisierung tun angezeigt werden soll, so dass es schön wäre, es zu haben, so schnell wie möglich, aber ehrlich gesagt, wenn ifstream Vorformen vernünftig, ich werde nicht‘ t Geist mit lesbarem Code kleben. Es ist ziemlich langsam jetzt ausgeführt, aber das könnte eher einen Hardware sein I / O-Begrenzung als alles, was ich in der Software tun, ich nur bestätigen wollte.

War es hilfreich?

Lösung

Ich denke, Ihre erste Sorge sein sollte, wie groß die Gleitkommazahlen sind. Sind sie schwimmen oder kann es zu doppelten Daten sein? Die traditionelle (C) Art und Weise für einen Schwimmer wäre mit dem Formatbezeichner zu verwenden fscanf und AFAIK es ziemlich schnell. Die iostreams machen einen geringen Overhead in Bezug hinzufügen von Analysieren der Daten, aber das ist eher zu vernachlässigen. Aus Gründen der Kürze würde ich vorschlagen, Sie iostreams verwenden (nicht der üblicher Strom zu erwähnen gehört, dass Sie mit ihm bekommen würden).

Außerdem glaube ich, dass es wirklich die Gemeinschaft helfen, wenn Sie die entsprechenden Nummern zusammen mit Ihrer Frage hinzufügen könnten, wie zum Beispiel, wie groß eine Datei, die Sie zu analysieren? Ist das eine kleine Speicherbedarf Umgebung (wie ein Embedded-System).

Andere Tipps

Es ist alles auf der Basis des Betriebssystems, und die Wahl von C und C ++ Standardbibliotheken.

Die Tage der langsamen ifstream sind ziemlich vorbei, aber es ist wahrscheinlich, einige Overhead in C ++ generische Schnittstellen Handhabung.

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

Schließlich wird jeder Versuch, Sie bekommen die Datei tun würden, lesen in dem Speicher wird wahrscheinlich vergeblich sein. Moderne Betriebssysteme in der Regel in die Quere kommen (vor allem, wenn die Datei größer als RAM ist, werden Sie tauschen Code am Ende, da das System Ihre (bereits auf Festplatte gespeichert) Daten als swappable behandeln).

Wenn Sie wirklich lächerlich schnell sein müssen (Die einzigen Orte, die ich denke, kann es sinnvoll sein wird, sind HPC und Karte / basierte Ansätze reduzieren) - try mmap (Linux / Unix) oder MapViewOfFile die Datei Prefetch in den virtuellen Speicher erhalten in atof + individuelle String-Handling der vernünftigste Ansatz, und dann.

Wenn die Datei wirklich gut für diese Art von Spiel organisiert ist, kann man sogar sein schrullige mit mmaps und Zeigern und hat die Umwandlung multithreaded. Klingt wie ein Spaß Übung, wenn Sie über 10 GB Schwimmer zu konvertieren auf einer regelmäßigen Basis haben.

Der schnellste Weg ist wahrscheinlich eine ifstream zu verwenden, aber Sie können auch verwenden fscanf. Wenn Sie eine bestimmte Plattform haben, können Sie die Datei in den Speicher von Hand laden und den Schwimmer aus manuell analysieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top