Ich habe eine Anwendung, bei der die gesamte Datenbank im Speicher mit einer stl-Map für jede Tabelle in der Datenbank implementiert ist.
Jedes Element in der stl-map ist ein komplexes Objekt mit Verweisen auf andere Elemente in anderen stl-maps.
Die Anwendung arbeitet mit einer großen Datenmenge, so dass sie mehr als 500 MByte RAM benötigt. Die Kunden können die Anwendung kontaktieren und eine gefilterte Version der gesamten Datenbank erhalten. Dies geschieht, indem die gesamte Datenbank durchlaufen wird und die für den Kunden relevanten Elemente gefunden werden.
Wenn die Anwendung etwa eine Stunde lang läuft, beginnt Windows 2003 SP2, Teile des Arbeitsspeichers für die Anwendung auszulagern (obwohl der Rechner über 16 GByte RAM verfügt).
Nachdem die Anwendung teilweise ausgelagert wurde, dauert eine Client-Anmeldung sehr lange (10 Minuten), da nun bei jedem Zeigersuchlauf in der Stl-Map ein Seitenfehler erzeugt wird. Wenn die Client-Anmeldung direkt danach ein zweites Mal ausgeführt wird, geht es schnell (wenige Sekunden), da der gesamte Speicher wieder im RAM ist.
Ich sehe, dass es möglich ist, Windows anzuweisen, den Speicher im RAM zu sperren, aber dies wird im Allgemeinen nur für Gerätetreiber und nur für "kleine" Mengen an Speicher empfohlen.
Ich schätze, eine schlechte Lösung könnte darin bestehen, die gesamte Speicherdatenbank in einer Schleife zu durchlaufen und so Windows mitzuteilen, dass wir weiterhin daran interessiert sind, das Datenmodell im RAM zu behalten.
Eine weitere schlechte Lösung könnte darin bestehen, die Auslagerungsdatei unter Windows vollständig zu deaktivieren.
Ich denke, die teuerste Lösung wäre eine SQL-Datenbank, und dann die gesamte Anwendung neu zu schreiben, um eine Datenbankschicht zu verwenden. Dann wird das Datenbanksystem hoffentlich Mittel für einen schnellen Zugriff implementiert haben.
Gibt es andere, elegantere Lösungen?