Datei als String mappen?
-
Ich hab mir eine Klasse gebastelt die um eine File-Klasse wrappt um nun auch mitten in der Datei easy Einfügen, Löschen, Ersetzen, etc. zu können. Diese Datei kopiert sich eine lokale Kopie der kompletten Datei in einen String, bearbeitet diesen und schreibt ihn im Destruktor wieder raus.
Das geht ja auch soweit ganz gut, bloß will ich nicht bei großen Dateien einen String dieser Größe anlegen.
Gibts da irgendwelche Möglichkeiten Windows zu sagen "Hey, da tu so als wäre diese Datei ein String und gib ihn mir!"?
Wäre toll
MfG SideWinder
-
ich kenn das von ACE, dass man files direkt in den speicher mapped. wenn der speicher voll ist lagert das os die daten eh wieder auf die festplatte aus...
da ACE im prinzip ein wrapper ist sollte das auch mit der winapi irgendwie gehen. müsste irgendwas mit "memory mapped file" oder so heissen.
-
Hallo,
das, was japro vorgeschlagen hat, gibt es en detail hier:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/base/file_mapping.asp
MfG
-
@japro
das Problem ist nur, dass das OS zwar den akkuten RAM für dich freischaufelt, aber wenn du zB. eine Anwendung hast, wo es üblich ist sehr große Dateien zu haben (zB. professionelle Filmprogramme), hast du dann zwei Kopien auf deiner Festplatte und auf 32Bit Maschinen ist gesamte Speicher (inklusive virtuellem) auf 4GB beschränkt.Deswegen sollte man sich überlegen, ob man nicht doch ein eigenes temporäres Schaufelsystem einbaut, was den Adressraum für dich freihält. Wobei du ein Problem hast, wenn du eine Art Transaktion auf abbilden willst (also nur schreiben, wenn alles sicher ist (commit; für die SQLer ;))), dass du zB. Unterschiede oder so temporär nur speicherst.
idr. ist das nicht schwer, der Programmierer könnte sich selber drum kümmern, dass nach einer starken Benutzung die Dinge ausgelagert werden
template<class charT, class traits=std::char_traits<charT> >> class mapped_stream_buf : public std::basic_streambuf<char,traits> { //... public: //... void tmp_unmap(); bool is_unmapped() const; };
oder fals du das nicht kontrollieren kannst, könntest du eine mapped_stream_buf Manager Klasse basteln und Zeitstempel und dann prüfen, wann das letzte mal von dem Stream gelesen wurde und den dann unmappen (was aber auch wieder bei vielen Dateien Rechenzeit kostet)