¿Es posible cambiar dinámicamente de FILE_FLAG_SEQUENTIAL_SCAN a FILE_FLAG_RANDOM_ACCESS?

Buenas tardes, Estamos construyendo un prototipo de deduper de Windows / LINUX utilizando la API de archivos mapeados en memoria de Windows y Linux. Nuestro deductor comienza haciendo un escaneo secuencial de todos los registros de la base de datos que se deben deducir. Por lo tanto, pasamos el indicador FILE_FLAG_SEQUENTIAL_SCAN al CreateFile de la API de Windows durante nuestro escaneo secuencial inicial de los registros de la base de datos que se deducirán. Una vez que terminamos la primera parte de nuestro proceso de deduplicación, intentamos usar la API de mapeo de memoria de Windows para acceder aleatoriamente a los datos. En este punto, utilizando la API de Windows C ++, ¿es posible cambiar dinámicamente al modo FILE_FLAG_RANDOM_ACCESS?

In Linux, we are are able to do this with the following excerpt of code, 
  MapPtr = (char*)mmap((void *)BaseMapPtr ,mappedlength,PROT_READ, 
            MAP_PRIVATE,  hFile,baseoff );
                    if (MapPtr == MAP_FAILED){
                        perror("mmap");
                        throw cException(ERR_MEMORYMAPPING,TempFileName);
                    }
 madvise(MapPtr,mappedlength,MADV_RANDOM);

¿Estamos pagando una penalización en Windows usando FILE_FLAG_SEQUENTIAL_SCAN durante la fase de acceso aleatorio de nuestro proceso de deduplicación? Gracias.

preguntado el 16 de mayo de 11 a las 16:05

3 Respuestas

Los indicadores de sugerencia de almacenamiento en caché que se pasan a CreateFile () no afectan la forma en que el administrador de memoria satisface las fallas de página generadas al eliminar la referencia a una dirección dentro de una sección mapeada. Dichas E / S usan lo mismo: usan las mismas páginas de caché que las E / S normales.

Dicho esto, cuando se crea un identificador para el archivo con FILE_FLAG_SEQUENTIAL_SCAN, el administrador de caché pueden realizar operaciones de lectura anticipada (e incluso puede leer todo el archivo en la memoria, si las condiciones del sistema lo permiten). Lo que significa que puede encontrar menos fallas de página si accede secuencialmente a las páginas del archivo mapeado.

Me parece que sería mejor para usted simplemente reutilizar el identificador que ha creado durante su procesamiento de-dup. El cierre y la reapertura pueden hacer que las páginas del archivo almacenadas en caché previamente se descarten, dependiendo de la presión de la caché.

contestado el 17 de mayo de 11 a las 04:05

Gracias por su respuesta. Acabo de aceptar tu respuesta. Cambiaré nuestro código para reutilizar el identificador que hemos creado durante nuestro procesamiento de deduplicación. Notamos que cuando se crea un identificador de archivo con FILE_FLAG_SEQUENTIAL_SCAN, encontramos menos fallas de página cuando accedemos secuencialmente a las páginas del archivo mapeado. ¿Eso significa que no intentamos utilizar FILE_FLAG_RANDOM_ACCESS durante nuestro procesamiento de deduplicación? Gracias. - Frank

@Frank: su millaje puede variar. Cuando se especifica FILE_FLAG_RANDOM_ACCESS, la lectura anticipada se desactivará para el identificador. Además, el administrador de caché será menos agresivo al desasignar las páginas del archivo visitadas anteriormente; la idea aquí es minimizar los eventos de asignación / desasignación del archivo cuando la aplicación vuelve a visitar las páginas. - Bukes

Gracias por su respuesta. Creo que intentaremos ejecutar nuestra aplicación de deduplicación con CreateFile (..., FILE_FLAG_RANDOM_ACCESS) para minimizar los eventos de mapeo / desasignación para el archivo mapeado en memoria cuando la aplicación de deduplicación vuelva a visitar las páginas. Debería ser interesante ver los resultados. Gracias. - Frank

Puede encontrar una descripción de cómo funciona FILE_FLAG_SEQUENTIAL_SCAN aquí: http://support.microsoft.com/kb/98756

Como solo se usa con la función CreateFile, no hay forma de actualizarlo una vez que se abre el archivo. Siempre puede cerrar el archivo y volver a abrirlo con una bandera diferente.

contestado el 16 de mayo de 11 a las 20:05

Gracias por la respuesta, acabo de aceptar tu respuesta. ¿Está sugiriendo que después de la primera fase de escaneo secuencial de nuestro deduper, cerremos el archivo? Luego, durante la fase final de acceso aleatorio, ¿deberíamos volver a abrir el archivo con FILE_FLAG_RANDOM_ACCESS? ¿Afectará esto nuestra capacidad para utilizar la API de archivos de asignación de memoria de Windows? Gracias. - Frank

Estamos probando tu sugerencia ahora mismo. Entonces: 1. cerramos (hFile) 2. hFile = CreateFile ((LPTSTR) TempFileName, .... Flags_ | FILE_FLAG_RANDOM_ACCESS); 3. Distance_.LowPart = (ULONG) FileSize_; Distance_.HighPart = 0; 4. dwPtr = :: SetFilePointer (hFile, Distance_.LowPart, & (Distance_.HighPart), FileBegin); 5. SetEndOfFile (hFile); 6. hMapping = :: CreateFileMapping (hFile, (SECURITY_ATTRIBUTES *) Security_, PAGE_READWRITE, 0,0,0); Gracias. - Frank

@Frank: La bandera que pasa no afecta el funcionamiento correcto de la E / S de archivos, solo afecta la eficiencia debido al almacenamiento en búfer. Es muy posible que el mapeo de memoria omita el almacenamiento en búfer por completo, no estoy seguro de eso. - Mark Ransom

Gracias por tu respuesta. Supongo que la única forma en que determinamos si el mapeo de memoria pasa por alto el almacenamiento en búfer por completo, es perfilar el código después de su sugerencia. Intentaremos informarle los resultados de nuestra prueba esta noche. Gracias. - Frank

Le pido disculpas por no hacerle saber los resultados de nuestra última noche. Tuve que reconstruir mi base de datos sqlite. Me preguntaba si leíste la respuesta de @ Buke (arriba). ¿Tú y @Bukes están diciendo básicamente la misma idea? Gracias por tu ayuda. - Frank

Solo para hacer una copia de seguridad de la respuesta de @Burkes: como mencionaste que estabas "usando la API de archivos mapeados en memoria de Windows", debe tenerse en cuenta que Raymond Chen advierte que las sugerencias de caché no afectan el efecto en la E / S mapeada en memoria:

Nota: Estas sugerencias de caché se aplican solo si usa ReadFile (o equivalentes morales). El acceso a archivos asignados en memoria no pasa por el administrador de caché y, en consecuencia, estas sugerencias de caché no tienen ningún efecto.

Entonces, lo que sucede que ya está almacenado en caché puede ayudar, pero los accesos futuros asignados a la memoria no ayudarán a que se llene / despoblar el caché.

Respondido el 04 de Septiembre de 17 a las 09:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.