optimierte ausgabeströme



  • Hallo,

    ich schreibe gerade an einem Exporter von 3D Modellen. In die Ausgabedatei schreibe ich per ofstream.

    Das Programm läuft etwa so ab.

    --------------------

    - hole Polygonmesh
    - speichere Punkte in Datenstruktur
    - for (int i = 0; i < |Punkte|; i++)
    {
    stream << Punkt1.x << Punkt1.y << Punkt1.z << endl;
    }

    die Dateien die dabei herauskommen werden relativ groß (> 150MB). Das herausschreiben dauert sehr lange. Gibt es eine Möglichkeit das zu beschleunigen (evtl. mit speziellem Puffer)? Oder soll ich einen anderen Streamtyp hernehmen?



  • wenn du die modelle nicht im textmodus exportierst,
    sondern die einfachen datentypen z.b. mit _write (...)
    in die datei schreibst, ist die datenmenge kleiner.

    könnte sich vielleicht positiv auf die performance auswirken.



  • ersetze mal das endl mal durch '\n' und schau ob es dann passt.
    denn endl flusht den Puffer - was effektiv bedeutet, dass du ohne Pufferung arbeitest.



  • Shade Of Mine schrieb:

    ersetze mal das endl mal durch '\n' und schau ob es dann passt.
    denn endl flusht den Puffer - was effektiv bedeutet, dass du ohne Pufferung arbeitest.

    hatte ich schon gemacht. war nur pseudocode.

    Ich hab gesehen das man seine eigenen Pufferklassen schreiben kann. Bringt das was? Oder bringt es was die Puffergröße zu ändern?

    Ich muss es im Textmodus schreiben. Das File läuft noch durch einen Parser.



  • mrtrashtalk schrieb:

    Ich hab gesehen das man seine eigenen Pufferklassen schreiben kann. Bringt das was? Oder bringt es was die Puffergröße zu ändern?

    Nicht wirklich viel.
    Sagen wirs mal so: die C++ Streams sind eher für fomatierte Ausgabe als für Speed optimiert.

    Ideal wäre es, wenn du alles mit einem Rutsch schreiben könntest - dh, zuerst im RAM bauen und dann in die Datei schreiben (müsste per FileMapping verdammt schnell gehen). Bzw. mit 20-50MB Chunks arbeiten.

    Und die OS API verwenden um in die Datei zu schreiben (wie gesagt: am besten per FileMapping (Windows: CreateFileMapping, Linux: mmap)


Anmelden zum Antworten