c# - mac - programa para liberar espacio en disco duro
¿Cómo vaciar/vaciar Windows LEER el caché de disco en C#? (5)
Si estoy tratando de determinar la velocidad de lectura de una unidad, puedo codificar una rutina para escribir archivos en un sistema de archivos y luego volver a leer esos archivos. Desafortunadamente, esto no proporciona una velocidad de lectura precisa porque Windows lee en caché el disco.
¿Hay alguna manera de limpiar la memoria caché de lectura de disco de una unidad en C # / .Net (o quizás con llamadas a la API Win32) para que pueda leer los archivos directamente desde la unidad sin que se almacenen en caché?
Encontré este artículo y parece que este es un programa complicado porque también tienes que eliminar otros cachés.
Por qué bricolaje?
Si solo necesita determinar la velocidad del disco y no está realmente interesado en aprender cómo eliminar los búfers de E / S de .NET, puede usar la utilidad DiskSpd desde http://research.microsoft.com/barc/Sequential_IO/ . Tiene modos aleatorios / secuenciales con y sin lavado de buffer.
La página también tiene algunos informes de investigación relacionados con E / S que pueden serle útiles.
Constantin: ¡Gracias! Ese enlace tiene un EXE de línea de comandos que hace las pruebas que estaba buscando.
También encontré un enlace de esa página a un artículo más interesante (en Word y PDF) en esta página: Patrones de programación de archivos secuencial y rendimiento con .NET
En este artículo, habla sobre el rendimiento de archivos sin búfer (por ejemplo, sin almacenamiento en caché de lectura / escritura, solo el rendimiento del disco en bruto).
Citado directamente del artículo:
No hay una forma sencilla de deshabilitar el almacenamiento en búfer de FileStream en el marco de V2 .NET. Se debe invocar el sistema de archivos de Windows directamente para obtener un identificador de archivo sin almacenamiento intermedio y luego ''ajustar'' el resultado en un FileStream de la siguiente manera en C #:
[DllImport("kernel32", SetLastError=true)]
static extern unsafe SafeFileHandle CreateFile(
string FileName, // file name
uint DesiredAccess, // access mode
uint ShareMode, // share mode
IntPtr SecurityAttributes, // Security Attr
uint CreationDisposition, // how to create
uint FlagsAndAttributes, // file attributes
SafeFileHandle hTemplate // template file
);
SafeFileHandle handle = CreateFile(FileName,
FileAccess.Read,
FileShare.None,
IntPtr.Zero,
FileMode.Open,
FILE_FLAG_NO_BUFFERING,
null);
FileStream stream = new FileStream(handle,
FileAccess.Read,
true,
4096);
Llamar a CreateFile () con el indicador FILE_FLAG_NO_BUFFERING le dice al sistema de archivos que omita todo el almacenamiento en memoria caché del software para el archivo. El valor ''verdadero'' pasado como el tercer argumento para el constructor FileStream indica que la secuencia debe tomar posesión del manejador del archivo, lo que significa que el manejador del archivo se cerrará automáticamente cuando se cierre la secuencia. Después de este hocus-pocus, la secuencia de archivos sin buffer se lee y escribe de la misma manera que cualquier otra.
La respuesta de Fix fue casi correcta y mejor que PInvoke. Pero tiene errores y no funciona ...
Para abrir el archivo sin almacenamiento en caché uno debe hacer lo siguiente:
const FileOptions FileFlagNoBuffering = (FileOptions)0x20000000;
FileStream file = new FileStream(fileName, fileMode, fileAccess, fileShare, blockSize,
FileFlagNoBuffering | FileOptions.WriteThrough | fileOptions);
Pocas reglas:
- blockSize debe estar alineado con el tamaño del clúster del disco duro (4096 la mayor parte del tiempo)
- el cambio de posición del archivo debe estar alineado con el tamaño del clúster
- no puedes leer / escribir menos que bloquear tamaño o bloquear no alineado con su tamaño
Y no lo olvide, también hay HDD Cache (que es más lento y más pequeño que el caché del sistema operativo) que no puede desactivar por eso (pero a veces FileOptions.WriteThrough ayuda a no almacenar en caché las escrituras). Con esas opciones, no tiene ninguna razón para enrojecer, pero asegúrese de haber probado adecuadamente que este enfoque no disminuirá la velocidad en caso de que la implementación de la memoria caché sea más lenta.
const int FILE_FLAG_NO_BUFFERING = 0x20000000;
return new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read,64 * 1024,
(FileOptions)FILE_FLAG_NO_BUFFERING | FileOptions.Asynchronous
& FileOptions.SequentialScan);