[fstream] große Dateiblöcke aus einer Datei in eine neue schreiben
-
Ich bin grad dabei ein Programm zu entwickeln, mit welchem ich eine Art File-Container anbieten kann. D.h. es werden sagen wir beispielhaft 10 Dateien in einen Store geschrieben. Mein Konzept dafür sieht so aus, dass alle Dateien des Stores in eine Einzige geschrieben werden und die Start- und Endposition in einer Config-Datei gespeichert werden. Das Hinzufügen und Extrahieren klappt auch problemlos, wobei sich das Extrahieren bei zu großen Dateien (ab 30 MB) extrem in die Länge ziehen kann, da ich ja aus der Store-Datei jedes Zeichen ab der Startposition auslese und in die neue Datei schreibe. Hat da jemand eine Idee wie das schneller zu lösen wäre? Also wie ich schnell einen großen Block Daten aus einer Datei von einer beliebigen Position an in eine neue Datei kriege?
Beim Hinzufügen habe ich das Problem dank rdbuf nicht, da Dateien, die hinzugefügt werden einfach an das Ende der Store-Datei gepappt werden ..
Hintergrund für eine Store-Datei (und nicht für jede hinzugefügte Datei eine extra Datei) ist, dass ich den Store a) Passwort geschützt öffnen lasse und b) ich alle Dateien einfach transportieren lassen will (praktisch wie ein Archiv).
Danke schon mal für Ideen und Vorschläge

Mfg Fake oder Echt
-
30 MB groß?
Hat man dich 1990 eingefroren und jetzt wieder aufgetaut? Lies das Ding doch einfach komplett ein!
-
Meinst du über read () anstatt über get () ?
Das war mir zu Speicher-intensiv deshalb bin ich auf die glorreiche Idee gekommen den User einfach warten zu lassen und jedes Zeichen einzeln auszulesen
& 30MB sind für meine bisherige Lösung groß, gemessen an der Zeit, die dafür zum Extrahieren benötigt wird ^^
-
Fake oder Echt schrieb:
Meinst du über read () anstatt über get () ?
Das war mir zu Speicher-intensiv deshalb bin ich auf die glorreiche Idee gekommen den User einfach warten zu lassen und jedes Zeichen einzeln auszulesen
Ehrlich gesagt weiß ich nicht ganz genau, was du überhaupt machen willst, weil dein Beitrag so verfasst ist, dass ich ihn ohne weitere Hintergrundinformationen nicht verstehen kann. Was ich mitgenommen habe ist, dass du aus irgendeinem Grund zeichenweise in einer Datei rumliest und dir dies zu langsam ist. Allgemeine Abhilfe dagegen ist, dass man sich alles im Block liest (geht sehr schnell) und dann im Arbeitsspeicher die zeichenweisen Aktionen durchführt (auch recht schnell).
& 30MB sind für meine bisherige Lösung groß, gemessen an der Zeit, die dafür zum Extrahieren benötigt wird ^^
Ach nun komm. Ich sitze gerade an einem Rechner mit 12 GB RAM. Die (nicht SSD-)Festplatte liefert mir rund 150 MB/s. Ich wette, dein System ist nicht viel anders. Wenn 30 MB da irgendwie eine nennenswerte Begrenzung sind, dann machst du etwas massiv falsch.
Es ist zwar immer hübsch und elegant, optimale Lösungen mit minimalem Festplattenzugriff zu suchen, aber manchmal ist es doch das einfachste, die moderne Technik auch mal auszunutzen und den direkten Lösungsweg zu wählen.
-
SeppJ schrieb:
Es ist zwar immer hübsch und elegant, optimale Lösungen mit minimalem Festplattenzugriff zu suchen, aber manchmal ist es doch das einfachste, die moderne Technik auch mal auszunutzen und den direkten Lösungsweg zu wählen.
Ja da hast du Recht .. ich hab immer noch die Angewohnheit, möglichst schonend mit den Resourcen umzugehen, was aus der Zeit herrührt, als ich noch mit nem 128 MB RAM, 800 MHz CPU Rechner rumgewerkelt habe .. Da war bei großen Dateioperationen jeder freie Byte im Arbeitsspeicher wichtig ^^
Muss ich mir aber mal abgewöhnen ..Werde dann mal deinen Vorschlag umsetzen

-
aber es ist doch abzusehen das aus den 30 mb irgendwann mal viel mehr wird und dann musste wieder alles umproggen weil sich die user über hohen speicherverbrauch beschweren
-
Fake oder Echt schrieb:
SeppJ schrieb:
Es ist zwar immer hübsch und elegant, optimale Lösungen mit minimalem Festplattenzugriff zu suchen, aber manchmal ist es doch das einfachste, die moderne Technik auch mal auszunutzen und den direkten Lösungsweg zu wählen.
Ja da hast du Recht .. ich hab immer noch die Angewohnheit, möglichst schonend mit den Resourcen umzugehen, was aus der Zeit herrührt, als ich noch mit nem 128 MB RAM, 800 MHz CPU Rechner rumgewerkelt habe .. Da war bei großen Dateioperationen jeder freie Byte im Arbeitsspeicher wichtig ^^
Du tust gerade so, als ob dein Rechner ein C64 war, dabei wars wahrscheinlich ein Pentium und da hat keiner auf einzelne Bytes geschaut.

-
zukunftseher schrieb:
aber es ist doch abzusehen das aus den 30 mb irgendwann mal viel mehr wird und dann musste wieder alles umproggen weil sich die user über hohen speicherverbrauch beschweren
Na und? Besser als wenn er sich jetzt einen abbricht und dann niemals größere Dateien einliest; you ain't gonna need it...
Die Kunst liegt darin, diesen Vorgang (wie jeden anderen auch) so zu kapseln, dass eine spätere Änderung keinen anderen Code betrifft.
-
In Pagesize-Blöcken zu lesen sollte ja auch ausreichen, also 4kb Buffer.
-
zukunftseher schrieb:
aber es ist doch abzusehen das aus den 30 mb irgendwann mal viel mehr wird und dann musste wieder alles umproggen weil sich die user über hohen speicherverbrauch beschweren
genau deshalb hatte ich ursprünglich gefragt, weil kapazität geht ja bis 2GB (unsigned bis 4) ^^
LollerRoller schrieb:
Du tust gerade so, als ob dein Rechner ein C64 war, dabei wars wahrscheinlich ein Pentium und da hat keiner auf einzelne Bytes geschaut.
war ein duron
und nein auf einzelne bytes musste ich da natürlich auch nicht achten, wobei kleinvieh irgendwann auch mist gemacht hatte, sagt man ja auch immer so schön 
Ethon schrieb:
In Pagesize-Blöcken
So hatte ich das jetz auch gelöst, per Define die Block-Größe bestimmt ..
-
Nimm statt define ein const int.
-
314159265358979 schrieb:
Nimm statt define ein const int.
ich wusste das das kommt

-
Wenn du es schon weisst, mach es doch beim nächsten Mal direkt richtig.
Es gibt keinen Grund, für Konstanten
#definezu nehmen.
-
jaja, danke an beide für den hinweis

-
zukunftseher schrieb:
aber es ist doch abzusehen das aus den 30 mb irgendwann mal viel mehr wird und dann musste wieder alles umproggen weil sich die user über hohen speicherverbrauch beschweren
Ist das so abzusehen? Kennst du die konkrete Anforderung oder sagt dir das deine Kristallkugel? Vielleicht ist dieses ominöse irgendwann ja auch erst dann, wenn man 12 TByte RAM hat.