Ich verwende Speicherabbilddateien, um Lese- / Schreibzugriff auf eine große Anzahl von Bilddateien (~ 10000 x 16 MB) unter Windows 7 64bit zu haben. Meine Ziele sind:
So viele Daten wie möglich zwischengespeichert haben.
Neue Bilder zuordnen und so schnell wie möglich schreiben können.
Daher verwende ich Speicherkarten für den Zugriff auf die Dateien. Caching funktioniert gut, aber das Betriebssystem löscht keine schmutzigen Seiten, bis ich fast keinen physischen Speicher mehr habe. Aus diesem Grund ist das Zuweisen und Schreiben neuer Dateien ziemlich langsam, sobald der physische Speicher voll ist.
Eine Lösung wäre, FlushViewOfFiles()
regelmäßig zu verwenden, aber diese Funktion kehrt erst zurück, wenn die Daten auf die Festplatte geschrieben wurden.
Gibt es eine Möglichkeit, eine Dateizuordnung asynchron zu löschen? Die einzige Lösung, die ich gefunden habe, ist wieder Unmap()
und MapViewOfFile()
, aber mit dieser Methode kann ich nicht sicher sein, den gleichen Datenzeiger wieder zu bekommen. Kann jemand einen besseren Ansatz vorschlagen?
Bearbeiten:
Als ich die WINAPI
-Dokumentation ein wenig länger gelesen habe, scheint es, dass ich eine passende Lösung für mein Problem gefunden habe:
Das Aufrufen von VirtualUnlock()
in einem Speicherbereich, der nicht gesperrt ist, führt zum Leeren von schmutzigen Seiten.
Ich habe gehört, dass die Funktion FlushViewOfFile () NICHT wartet, bis sie physisch in die Datei schreibt.
Die FlushViewOfFile-Funktion löscht die Dateimetadaten nicht und wartet nicht darauf, zurückzukehren, bis die Änderungen vom zugrunde liegenden Festplattencache der Festplatte gelöscht und physisch auf die Festplatte geschrieben wurden.
Nach dem Aufruf "FlushFileBuffers (...)" werden Ihre Daten physisch auf die Festplatte geschrieben.
Tags und Links c++ memory-mapped-files