2010-05-21 16 views
7

Tengo un fragmento de código que lee muchísimo (cientos de miles) de archivos relativamente pequeños (par de KB) del sistema de archivos local en un bucle. Para cada archivo hay un java.io.FileInputStream creado para leer el contenido. El proceso es muy lento y demora años.¿Qué pasa con el almacenamiento en búfer de FileInputStream?

¿Cree que envolver el FIS en java.io.BufferedInputStream haría una gran diferencia?

+4

¿Por qué no intentar y medir la diferencia usted mismo? Esta es la única forma de saber cómo funciona en su entorno, con su JVM, etc. –

+1

He medido esto en mi entorno. No hay una gran mejora cuando se envuelve el FIS en BIS. –

Respuesta

9

Si no está utilizando un byte[] buffer de un tamaño decente en el bucle de lectura/escritura (la última versión de BufferedInputStream utiliza 8KB), entonces será sin duda la diferencia maquillaje. Pruébalo tú mismo. No se olvide de hacer cualquier OutputStream a BufferedOutputStream también.

Pero si ya lo ha protegido con un byte[] y/o después de todo solo hace poca diferencia, entonces ha golpeado el disco duro y la velocidad del controlador de E/S como el cuello de botella.

3

Tengo muchas dudas de si eso hará alguna diferencia.

Su problema fundamental es los cientos de miles de archivos pequeños. Leerlos hará que el disco se agite y tome para siempre, no importa cómo lo hagas, pasarás el 99,9% del tiempo esperando el movimiento mecánico dentro del disco duro.

Hay dos maneras de solucionar este problema:

  • guardar los datos en un disco SSD - tienen mucho más bajos (como en cinco órdenes de magnitud menos) latencia.
  • reorganizar sus datos en unos archivos de gran tamaño y leer los secuencialmente
3

Eso depende de cómo se está leyendo los datos. Si está leyendo FileInputStream de una manera muy ineficiente (por ejemplo, llamando a read() byte-by-byte), entonces usar un BufferedInputStream podría mejorar las cosas dramáticamente. Pero si ya está utilizando un búfer de tamaño razonable con FileInputStream, cambiar a un BufferedInputStream no tendrá importancia.

Dado que está hablando de una gran cantidad de archivos muy pequeños, existe una gran posibilidad de que gran parte del retraso se deba a operaciones de directorio (abrir, cerrar), no a la lectura real de bytes de los archivos.

Cuestiones relacionadas