.net - visual - Tamaño óptimo de lectura de búfer de archivo?
profiler vs2017 (2)
Depende de dónde dibuje la línea entre el tiempo de acceso y el uso de la memoria. Cuanto mayor sea el búfer, más rápido, pero más caro en términos de memoria. la lectura en múltiplos de su tamaño de clúster del sistema de archivos es probablemente la más eficiente, en un sistema Windows XP que utiliza NTFS, 4K es el tamaño de clúster predeterminado.
Puede ver este enlace Tamaño de clúster predeterminado para NTFS, FAT y exFAT
Adiós.
Estoy escribiendo una aplicación que necesita leer archivos bastante grandes. Siempre me he preguntado cuál es el tamaño óptimo para el búfer de lectura en una computadora moderna con Windows XP. Busqué en Google y encontré muchos ejemplos que tenían 1024 como el tamaño óptimo.
Aquí hay un fragmento de lo que quiero decir:
long pointer = 0;
buffer = new byte[1024]; // What''s a good size here ?
while (pointer < input.Length)
{
pointer += input.Read(buffer, 0, buffer.Length);
}
Mi aplicación es bastante simple, por lo que no estoy buscando escribir ningún código de referencia, pero ¿me gustaría saber qué tamaños son comunes?
Un tamaño de búfer de 1k parece un poco pequeño. En general, no hay un tamaño de búfer de "talla única". Debe establecer un tamaño de búfer que se ajuste al comportamiento de su algoritmo. Ahora, en general, no es una buena idea tener un búfer realmente enorme, pero tener uno que sea demasiado pequeño o no esté en línea con la forma en que procesa cada fragmento tampoco es tan bueno.
Si simplemente está leyendo datos una parte tras otra por completo en la memoria antes de procesarlos, usaría un búfer más grande. Probablemente usaría 8k o 16k, pero probablemente no más grande.
Por otro lado, si está procesando los datos en forma de transmisión, leyendo un fragmento y luego procesándolos antes de leer el siguiente, los búferes más pequeños podrían ser más útiles. Aún mejor, si está transmitiendo datos que tienen una estructura, cambiaría la cantidad de datos leídos para que coincida específicamente con el tipo de datos que está leyendo. Por ejemplo, si está leyendo datos binarios que contienen un código de 4 caracteres, un flotador y una cadena, leería el código de 4 caracteres en una matriz de 4 bytes, así como el flotante. Me gustaría leer la longitud de la cadena, y luego crear un búfer para leer la totalidad de la cadena de datos a la vez.
Si está realizando el procesamiento de datos de transmisión por secuencias, buscaría en las clases BinaryReader y BinaryWriter. Estos le permiten trabajar con datos binarios muy fácilmente, sin tener que preocuparse mucho por los datos en sí. También le permite desacoplar el tamaño de su búfer de los datos reales con los que está trabajando. Puede establecer un búfer de 16k en el flujo subyacente y leer los valores de datos individuales con el BinaryReader con facilidad.