Ich habe ein Visual Studio 2008 C ++ - Projekt für Windows Mobile 6.x, wo ich mehr Speicher benötige, als mir im 32-MB-Prozess-Slot zur Verfügung steht. Also, ich suche Speicher-Mapped-Dateien. Ich habe eine Standardzuweisungsimplementierung erstellt, die neues / delete durch CreateFileMapping und MapViewOfFile .
Die beabsichtigte Verwendung ist etwa so:
%Vor% Mit std::allocator
kann ich in diesem Beispiel 28197 Iterationen bekommen, bevor ich eine std::bad_alloc
Ausnahme bekomme. Mit dem MappedFileAllocator
bekomme ich 32371 Iterationen, bevor das Gerät vollständig einfriert und neu gestartet werden muss. Da mein Gerät 512 MB RAM hat, habe ich erwartet, dass ich weit mehr Iterationen aus dieser Schleife herausholen kann.
Meine MappedFileAllocator
Implementierung ist:
Kann jemand vorschlagen, wo ich mit meiner MappedFileAllocator
-Implementierung falsch liegen könnte?
Danke, PaulH
Ich habe gerade die "populäre Frage" -Abzeichen für dieses hier, also dachte ich, dass ich (verspätet) die Antwort posten würde. Ich hatte keine verfügbaren Griffe mehr. Im Windows Mobile-Kernel gibt es einen unsigned short counter, der sich auf die überlaufende Handle-Zuweisung bezieht. Sobald das passiert ist, würde das Gerät einfrieren.
Sie verwenden eine anonyme Dateizuordnung (eine ohne eine tatsächliche Datei, die sie unterstützt). Wenn Sie dies tun, wird die Zuordnung von der Systemauslagerungsdatei unterstützt. Es ist wahrscheinlich, dass das mobile Betriebssystem nicht wirklich eine Page-Datei hat, weil die "Festplatte" wahrscheinlich ein Flash-Gerät ist. Es ist im Allgemeinen eine schlechte Idee, einen virtuellen Speicher-Paging zu Flash-Geräten durchzuführen, da die Art des virtuellen Speichers eine große Menge von Schreibvorgängen bedeutet, die Flash schnell ausbrennen können (besonders ältere Typen).
Dies scheint durch die Anzahl der Iterationen unterstützt zu werden, die Sie erhalten. Es sieht so aus, als könnten Sie bis zu 60% des gesamten Speichers auf Ihrem Gerät abbilden.
Sie können wahrscheinlich mit größeren Abschnitten arbeiten, wenn Sie eine echte Datei öffnen (mit OpenFile
) und diese zuordnen, anstatt INVALID_FILE_HANDLE
in CreateFileMapping
zu verwenden. Aber seien Sie vorsichtig mit Ihrem Flash-Speicher (und der Leistung!), Wenn Sie sehr viel in Ihr Datei-Mapping schreiben werden.
Tags und Links memory c++ memory-mapped-files windows-mobile virtual-memory