2012-07-09 12 views
8

Estoy usando archivos mapeados en memoria para tener acceso de lectura/escritura a una gran cantidad de archivos de imagen (~ 10000 x 16 MB) en Windows 7 64bit. Mis objetivos son:¿Cómo vaciar de forma asíncrona un archivo mapeado en memoria?

  1. Tener tantos datos en caché como sea posible.

  2. Ser capaz de asignar nuevas imágenes y escribirlas lo más rápido posible.

Por lo tanto, estoy usando archivos de memoria mapeados para acceder a los archivos. El almacenamiento en caché funciona bien, pero el sistema operativo no está vaciando páginas sucias hasta que casi no tengo memoria física. Debido a que asignar y escribir en archivos nuevos es bastante lento una vez que se llena la memoria física.

Una solución sería utilizar regularmente FlushViewOfFiles(), pero esta función no se devuelve hasta que los datos se hayan escrito en el disco.

¿Hay alguna manera de eliminar asincrónicamente una asignación de archivos? La única solución que encontré es Unmap() y MapViewOfFile() nuevamente, pero usando este enfoque no puedo estar seguro de obtener el mismo puntero de datos otra vez. ¿Alguien puede sugerir un mejor enfoque?

Editar: Leer la documentación WINAPI un poco más, parece que he encontrado una solución adecuada a mi problema:

Calling VirtualUnlock() en un rango de memoria que no está bloqueado resultados en un enrojecimiento de las páginas sucias.

Respuesta

2

Escuché que la función FlushViewOfFile() NO espera hasta que se escriba físicamente en el archivo.

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

La función FlushViewOfFile no descarga los metadatos del archivo, y no esperar a volver hasta que los cambios se vacían de la caché de disco de hardware subyacente y físicamente escriben en el disco.

Después de la llamada "FlushFileBuffers (...)", sus datos se escribirán físicamente en el disco.

Cuestiones relacionadas