Как асинхронно очистить файл с отображением памяти?

Я использую файлы с отображением памяти, чтобы иметь доступ для чтения/записи к большому количеству файлов изображений (~ 10000 x 16 МБ) под 64-разрядной версией Windows 7. Мои цели:

  1. Кэшировать как можно больше данных.

  2. Возможность размещать новые изображения и записывать их как можно быстрее.

Поэтому я использую файлы с отображением памяти для доступа к файлам. Кэширование работает хорошо, но ОС не сбрасывает грязные страницы до тех пор, пока у меня почти не закончится физическая память. Из-за этого выделение и запись в новые файлы происходит довольно медленно после заполнения физической памяти.

Одним из решений было бы регулярное использование FlushViewOfFile(), но эта функция не возвращает значение до тех пор, пока данные не будут записаны на диск.

Есть ли способ асинхронно очистить сопоставление файлов? Единственное решение, которое я нашел, - это снова Unmap() и MapViewOfFile(), но, используя этот подход, я не могу быть уверен, что снова получу тот же указатель данных. Может ли кто-нибудь предложить лучший подход?

Редактировать: Читая документацию WINAPI немного дольше, кажется, я нашел подходящее решение моей проблемы:

Вызов VirtualUnlock() для незаблокированного диапазона памяти приводит к сбросу грязных страниц.


person user1511305    schedule 09.07.2012    source источник


Ответы (1)


Я слышал, что функция FlushViewOfFile() НЕ ждет, пока она физически запишется в файл.

http://msdn.microsoft.com/en-us/library/windows/desktop/aa366563(v=vs.85).aspx

Функция FlushViewOfFile не сбрасывает метаданные файла и не ожидает возврата, пока изменения не будут сброшены из базового аппаратного дискового кэша и физически записаны на диск.

После вызова "FlushFileBuffers(...)" ваши данные будут физически записаны на диск.

person gun9    schedule 01.07.2013
comment
Я только что выполнил микротесты в Windows 10, и вызов FlushViewOfFile() блокируется (хотя это может быть не так). Есть ли у вас какие-либо идеи по воспроизведению MS_ASYNC поведения Linux? - person Joannes Vermorel; 20.12.2018