2011-09-05 11 views
9

¿Cuál es el tamaño de búfer sensible que se debe utilizar al transferir (independientemente de ARRIBA/ABAJO) archivos grandes (3-4 gigas) con Java?Tamaño de búfer sensible al descargar archivos en Java

byte buf[] = new byte[1024] 

o

byte buf[] = new byte[5 * 1024 * 1024] 

A veces, incluso si se utiliza un buffer de gran tamaño y se pasa a un método de lectura (array byte []) esto no le garantiza que obtendrá un total de 5 tampón ME . En mis pruebas, he observado que el tamaño promedio suele ser de 1.5 kb por invocación de lectura(). ¿Tiene sentido el rendimiento en cuanto al rendimiento? Me gustaría que alguien me señale un recurso para discutir el tema en mayor detalle.

Respuesta

10

suena como que está leyendo de una conexión de red (TCP?)

1500 bytes por defecto es el de Ethernet MTU, lo que explica por qué está típicamente conseguir por 1,5 kb de lectura. La MTU a menudo se puede aumentar a 9 KB configurando las pilas de la red para usar jumbo frames.

Teniendo esto en cuenta, casi con certeza no tiene sentido hacer buf más grande que 9KB. Usar un buffer más pequeño (digamos más de 1KB) puede o no afectar negativamente el rendimiento.

En cualquier caso, la única manera de obtener una respuesta definitiva es mediante la evaluación comparativa de varios tamaños de búfer.

+0

Hmz, buen punto. Realmente no he tenido en cuenta el MTU de la pila TCP. – LordDoskias

+1

El uso de memorias intermedias más grandes reducirá el número de conmutadores entre el código Java y el código nativo y puede tener un impacto en el rendimiento, independientemente del tamaño del paquete de red. – jarnbjo

+0

Como muestra mi experiencia 8-100KB buffer es lo suficientemente bueno. – umbr

1

En mi investigación & prueba, 8K es el tamaño de búfer óptimo al leer desde un socket en Linux con Java 6. Si asigna un búfer que es mayor que 8K, será simplemente una pérdida de espacio. He leído que la llamada nativa Java usa un buffer 8K y esta es la razón por la que 8K es óptimo pero he perdido mi referencia. Hay un error que apunta a este hecho, pero no es una prueba concluyente: http://bugs.sun.com/view_bug.do?bug_id=6444633

Dicho esto, intente experimentar en la plataforma en la que desea implementar y encontrará el tamaño de búfer óptimo. Si eres perezoso, 8K es un gran valor predeterminado.

Cuestiones relacionadas