Gibt es eine ofstream Grenze?



  • Solange du kein "cout << flush" aufrufst, wird alles im Speicher gehalten.



  • Th schrieb:

    Solange du kein "cout << flush" aufrufst, wird alles im Speicher gehalten.

    falsch, die implementation entscheided, wann geschrieben wird. ist der buffer voll gibts keinen größeren, sondern es wird in die datei geschrieben. Natürlich kann man das schreiben mit flush erzwingen, aber das muss man nicht.



  • Auch bei NTFS wirst Du entweder an der 2 oder 4 GB Grenze scheitern - weil die Standardbibliothek das einfach nicht kann. Du brauchst hier spezielle OS-Funktionen. Da Du unter Windows bist, ist die einzig offizielle Möglichkeit für 64-Bit Dateizugriff CreateFileMapping. (CreateFile geht meines Wissens nach auch, wird aber in der API-Doku net ausdrücklich als dafür geeignet erwähnt)

    Aber an Dateigrößen scheint es erstmal noch nicht zu scheitern. Kann es nicht einfach sein, dass Dir Speicher & Swapspace ausgeht? Deshalb auch das Plattenrödeln. Beobachte das doch mal im Taskmanager.



  • MFK schrieb:

    Ich vermute, dein Programm kommt gar nicht dazu, irgendwas auf die Platte zu schreiben, weil dir schon vorher der Speicher ausgeht.

    Möglich. Die Belastung der CPU (2,6GHz) steigt zu Beginn auf 100% an und sinkt nacht wenigen Sekunden auf 3% ab. Der Arbeitsspeicher (512MB) wird vollständig aufgebraucht und die Auslagerungsdatei steigt sprunghaft an. Die Festplattenaktivität geht ans Maximum und verbleibt dort, bis nach einigen Minuten das Programm beendet wird (Runtime problem...). Ich werde das ganze mal mit 1GB Ram testen.

    MFK schrieb:

    Es wäre besser, wenn du nicht zuerst alle Permutationen ermittelst, und dann alles auf einmal auf die Platte schreibst.

    Daran habe ich auch schon gedacht. Wollte aber vorher mal die Meinung von euch dazu hören. 🙂

    MFK schrieb:

    Welchen Container benutzt du denn da überhaupt?

    vector<string>

    cu



  • vector<string>

    nicht gut wenn man viel hinten einfügen muss.



  • das problem ist aber auch, dass windows dir nie mehr als 4gb arbeitsspeicher zur verfügung stellen wird.



  • otze schrieb:

    das problem ist aber auch, dass windows dir nie mehr als 4gb arbeitsspeicher zur verfügung stellen wird.

    2 oder 3



  • Snack_Hippo schrieb:

    Ich werde das ganze mal mit 1GB Ram testen.
    ...
    vector<string>

    Überschlag das doch einfach mal: Du brauchst 11! = 39916800 Strings.
    Jeder String hat 11 Zeichen, dazu kommt die Instanz der String-Klasse selbst. sizeof(std::string) ist bei mir (VS.NET2005B2) 28. Das macht dann schon mal mindestens 1,45 GByte.

    Wenn du nicht von Anfang an den vector auf die richtige Länge setzt, muss der irgendwann seinen Inhalt umkopieren, um sich zu vergrößern. Das kann den Speicherbedarf mal eben verdoppeln.

    Ich empfehle dir, die ermittelten Permutationen gleich in die Datei zu schreiben.



  • Wieso nimmst du nicht einfach mehere Dateien? Also so etwa bei 512MB öffnest du einfach eine neue Datei und schreibst darin.



  • sag mal was bringt das eigentlich wenn der müll in der datei steht??


Anmelden zum Antworten