2012-01-05 11 views
29

Al leer InputStreams, ¿cómo se decide qué tamaño usar para el byte []?¿Cómo se decide qué tamaño de byte [] usar para InputStream.read()?

int nRead; 
byte[] data = new byte[16384]; // <-- this number is the one I'm wondering about 

while ((nRead = is.read(data, 0, data.length)) != -1) { 
    ...do something.. 
} 

¿Cuándo utiliza uno pequeño frente a uno grande? ¿Cuáles son las diferencias? ¿El número quiere estar en incrementos de 1024? ¿Hace una diferencia si se trata de un InputStream de la red frente al disco?

Muchas gracias, parece que no puedo encontrar una respuesta clara en otro lugar.

+3

Me pregunto la misma pregunta para C#. Supongo que es la misma respuesta. Probablemente, la huella de memoria se puede tener en cuenta (cuanto más pequeño es el espacio, menor es la huella de memoria). Otro factor es el tipo de flujo de entrada ... Un flujo de red tomará más tiempo para llenar el búfer en comparación con una secuencia de memoria ... Obtendrá menos control con un búfer grande. –

+1

datos más grandes deberían acelerar la lectura de la fuente rápida (menos iteraciones) y, por otra parte, una pérdida de espacio en el caso de fuentes lentas (la velocidad está dominada por la espera, por lo que no importa qué tan rápido sea su ciclo) – akappa

Respuesta

19

La mayoría de las personas usa potencias de 2 para el tamaño. Si el búfer es de al menos 512 bytes, no hace mucha diferencia (< 20%)

Para la red, el tamaño óptimo puede ser de 2 KB a 8 KB (El tamaño del paquete subyacente suele ser de ~ 1.5 KB) Para el acceso al disco, el tamaño más rápido puede ser de 8K a 64 KB. Si usa 8K o 16K, no tendrá problemas.

Nota para las descargas de red, es probable que encuentre que, por lo general, no utiliza todo el almacenamiento intermedio. Perder unos pocos KB no importa mucho en el 99% de los casos de uso.

1

Al utilizar el método available() en la clase InputStream. Desde el Javadoc:

Devuelve el número de bytes que se pueden leer (o saltadas) de este flujo de entrada sin bloquear por la siguiente llamada de un método para este flujo de entrada. La siguiente persona que llama podría ser el mismo subproceso o otro subproceso.

3

En su mayoría depende de la cantidad de memoria que tenga y la cantidad de datos que espera leer. No desea bloquear con demasiada frecuencia, por lo tanto, considere la respuesta de BenCole; por otro lado, no desea procesar un pequeño fragmento de datos si su procesamiento es más lento que la lectura real.

Personalmente intento utilizar una biblioteca y descargo la tarea de elegir un tamaño de búfer para los autores de la biblioteca. Después de eso, me prometo que nunca leeré el código de la biblioteca, porque me enoja.

3

En esa situación, siempre uso una potencia razonable de 2, en algún lugar en el rango de 2K a 16K. En general, diferentes InputStreams tendrán diferentes valores óptimos, pero no hay una manera fácil de determinar el valor.

Para determinar el valor óptimo, debe comprender más sobre el tipo exacto de InputStream con el que está tratando, así como cosas como las especificaciones del hardware que está dando servicio a InputStream.

Preocuparse por esto es probablemente un caso de optimización prematura.

Cuestiones relacionadas