2009-10-11 26 views
17

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.Tamaño óptimo de lectura del búfer de archivos?

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

+0

Puede ser útil: http://stackoverflow.com/questions/19558435/what-is-the-best-buffer-size-when-using-binaryreader-to-read-big-files-1gb/19837238? noredirect = 1 # 19837238 –

Respuesta

7

Un tamaño de memoria intermedia de 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 los datos un trozo tras otro completamente en la memoria antes de procesarlo, 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á realizando 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.

+0

Gracias por la sugerencia de utilizar un BinaryReader. Usar el BinaryReader ayuda a leer cadenas ya que no necesito escribir el código de plomería para escribir la longitud. Voy a probar lecturas de 8K y 16K para ver si el rendimiento mejora. Personalmente, no me importa cuál es el tamaño, pero algunos de los miembros de QA quieren ver si podemos mejorar el rendimiento utilizando mejor el hardware y el sistema operativo. –

+0

Puede probar un búfer más grande si simplemente está transmitiendo una gran cantidad de datos a la memoria. Siempre que mantenga el tamaño del búfer en un múltiplo del tamaño del clúster del disco, debería ser óptimo. Para ser honesto, creo que todavía tengo muchas de las prácticas de mi viejo final de los 90 y principios de 2000 aún profundamente arraigadas. Si los sistemas en los que está ejecutando este programa son modernos y de alto rendimiento, pueden ser útiles los buffers de 32k, 64k, incluso más grandes. Si vas demasiado grande (digamos 1mb), es posible que veas rendimientos decrecientes a medida que entren otros factores (es decir, swap de intercambio). La clave es hacer coincidir las lecturas con el comportamiento de bajo nivel. – jrista

3

Depende de dónde se traza 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. leyendo 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.

Se puede ver este enlace Default cluster size for NTFS, FAT, and exFAT

adiós.

+0

Probaré lecturas de 8K y 16K sugeridas por @jrista. Es interesante que el artículo dice que Windows usa clústers de 8k para particiones de discos de 16 TB. No he visto una partición tan grande antes. –

+1

Andrew, 8K y 16K son múltiplos de 4K – RRUZ

+0

Los discos duros antiguos leen y escriben sectores enteros de 512 bytes a la vez. Los discos duros modernos leen y escriben sectores completos de 4096 bytes a la vez. Windows NTFS tiene un tamaño de clúster (predeterminado) de 4096 bytes a la vez. Utilizando el seguimiento de eventos para Windows puede ver que Windows más comúnmente realiza operaciones de E/S en disco duro para '16,384' bytes, junto con' 4,096' bytes (y en menor grado '8192' y' 49152' bytes). Lo ideal es mantener un múltiplo de 4k o 16384 bytes. –

Cuestiones relacionadas