2010-07-18 20 views
6

Duplicar posible:
How to invalidate the file system cache?¿Cómo puedo forzar a Windows a borrar todos los datos de la memoria caché de lectura del disco?

Estoy escribiendo un programa intensivo de win32 disco. La primera vez que se ejecuta, se ejecuta mucho más lento mientras escanea las carpetas del usuario utilizando FindFirstFile()/FindNextFile().

¿Cómo puedo repetir esta primera interpretación sin reiniciar? ¿Hay alguna manera de forzar al sistema a descartar todo en su caché de disco?

Sé que si estuviera leyendo un solo archivo, puedo inhabilitar el almacenamiento en caché pasando el indicador FILE_FLAG_NO_BUFFERING a una llamada a CreateFile(). Pero no parece posible hacer esto al buscar archivos.

+1

+1 Estaba llegando a publicar una publicación relacionada yo mismo. Al tratar de calcular el rendimiento de los algoritmos relacionados con el disco, el almacenamiento en caché realmente se interpone. Buena pregunta. –

Respuesta

0

Intenté todos los métodos en las respuestas, incluido CacheSet, pero no funcionarían para FindFirstFile/FindNextfile(). Esto es lo que funcionó:

  • Escaneo de archivos a través de la red. Al escanear una unidad compartida, parece que Windows no almacena en caché las carpetas, por lo que es lenta todo el tiempo.

  • La forma más sencilla de hacer que cualquier algoritmo sea más lento es insertar llamadas en Sleep(). Esto puede revelar muchos problemas en el código de subprocesos múltiples, y eso es lo que realmente estaba tratando de hacer.

+1

Para tener en cuenta, el cliente SMB de Windows y el servidor SMB de Windows tienen sus propios cachés con los que está tratando (y HDD, y otras memorias caché, nivel SAN, controlador RAID ...). Su mejor apuesta, ya que la magia de CacheSet no funciona (estoy de acuerdo), es "inundar el caché" para que purgue las entradas anteriores. Es decir, debe determinar el tamaño de todas las memorias caché involucradas y llenarlas para que sus datos previamente leídos/escritos se eliminen (o se vacíen a un almacenamiento estable). vea HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Services \ lanmanserver \ parameters reg_dword: TreatHostAsStableStorage. – mbrownnyc

0

Puede evitar un reinicio físico utilizando una máquina virtual.

+1

Esto no funciona. El sistema operativo anfitrión termina haciendo caché también, lo que hace que las pruebas sean inexactas. –

1

Necesita crear suficiente presión de memoria para que el administrador de memoria y el administrador de caché descarten los resultados de la memoria caché anterior. Para el administrador de caché, puede tratar de abrir un archivo grande (es decir, más grande que el ram físico) con el almacenamiento en caché habilitado y luego leerlo hacia atrás (para evitar optimizaciones secuenciales de E/S). Las interacciones entre vm y el administrador de caché son un poco más complejas y dependen mucho más de la versión del sistema operativo.

También hay cachés en el controlador (posiblemente, pero poco probable) y en la propia unidad de disco (probable). Hay IoCtls específicos para eliminar este caché, pero en mi experiencia, el firmware del disco no se ha probado en este campo.

+0

Esto es exactamente lo que siempre he hecho. Una manera fácil es abrir un archivo grande y buscar una secuencia de bytes que no existen en el archivo. Windows inundará el caché con el nuevo archivo y eliminará los datos viejos. No es ideal, pero funciona. – Synetech

3

¿Ha pensado en hacerlo en un volumen diferente y en desmontar/volver a subir el volumen? Eso hará que la gran mayoría de todo se vuelva a leer desde el disco (aunque a la memoria caché no le importará).

+0

+1 - este es el único enfoque aquí que será consistente. –

1

Echa un vistazo a la función Borrar de CacheSet de SysInternals.

+0

Lo probé en Windows XP y enumerar a través de las carpetas del disco fue tan rápido después de borrar la caché como antes, por lo que parecía no funcionar. –

Cuestiones relacionadas