Óptimo tamaño de lectura del búfer de archivo?

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, así que no estoy buscando escribir ningún código de evaluación comparativa, pero me gustaría saber qué tamaños son comunes.

Un tamaño de buffer 1k parece un poco pequeño. En general, no existe 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 buffer realmente grande, pero tener uno que sea demasiado pequeño o que no esté en línea con la forma en que se procesa cada fragmento tampoco es tan bueno.

Si simplemente está leyendo datos de un fragmento tras otro completamente en la memoria antes de procesarlos, usaría un buffer 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ándolo 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 estructura, cambiaría la cantidad de datos leídos para que coincidan 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 también el flotador. Leería la longitud de la cadena, luego crearía un búfer para leer todo el fragmento de datos de cadena a la vez.

Si está haciendo un procesamiento de datos en tiempo real, examinaría las clases BinaryReader y BinaryWriter. Esto le permite trabajar con datos binarios muy fácilmente, sin tener que preocuparse demasiado 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 la secuencia subyacente y leer valores de datos individuales con el BinaryReader con facilidad.

Depende de dónde traces la línea entre el tiempo de acceso y el uso de la memoria. Cuanto mayor sea el buffer, más rápido, pero más costoso en términos de memoria. leer en múltiplos de su tamaño de clúster de sistema de archivos es probablemente el más eficiente, en un sistema Windows XP que usa 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.