[C++, STL] vector statt im Speicher in Datei halten

Onkel Schuppig

Erfahrenes Mitglied
Hallo allerseits,
ich habe wieder mal mit riesigen Datenmengen zu tun. Dieses Mal geht es um vector<T>, der durchaus so groß werden kann, dass eine bad_alloc exception ausgeworfen wird. Algorithmisch gesehen komme ich um so einen großen Vektor aber nicht herum.
Da man dem vector ja einen Allocator vorschreiben kann, kam ich auf die Idee, ob man den Vektorinhalt nicht in einer Datei verwalten kann.
Ich bräuchte dann den Algorithmus gar nicht groß umschreiben, sondern nur einen selbstentwickelten Allokator mitgeben.
Bevor ich weitermache, wollte ich fragen, ob das überhaupt denkbar ist?
 
Du möchtest also eine Datei aufbauen, die Datensätze gleicher Struktur hintereinanderschreibt, und die du später bei Bedarf teilweise wieder einlesen und verarbeiten kannst. Mit anderen Worten: du hättest gerne eine (index-)sequentielle Datei. Du hast oder findest bestimmt eine Bibliothek mit Datenbankklassen, die das unterstützt (Stichwort ISAM).
 
Ja, die Datei enthält ausschließlich Blöcke gleicher Größe.
Damit ich nicht den ganzen Code umschreiben muss, wäre es super, wenn ich vector behalten könnte und wahlweise auf "memory" oder "file" basiere.
Ist für mich auch allgemein sehr interessant.
C++:
#include <vector>

// Standard
std::vector< Datensatz > vec1;

// mit eigenem Allocator, der erst noch entwickelt werden muss.
std::vector< Datensatz, FileAllocator<Datensatz> > vec2;

Ich bin fast überzeugt, dass das irgendwie geht. Ich habe im Internet schon einen Artikel gefunden ("writing your own STL allocator").
Wenn ich damit klar komme, stelle ich den Code mal hier ein.
 
Zuletzt bearbeitet von einem Moderator:
Ich glaube trotzdem, dass die Einbeziehung von ISAM- bzw. Datenbankklassen sich lohnen würde. Die abzufragenden Daten könntest du immer noch in einen vector überführen, Änderungen kannst du mit UPDATE-Statements direkt in der Datei machen, die benötigten Sätze können komfortabel mit einem SELECT-Statement herausgesucht werden etc. Möglicherweise vereinfacht das auch deine Verarbeitungsroutinen.
 
Zurück