¿Cuál es una forma eficiente para una aplicación multiproceso de Java donde muchos hilos tienen que leer exactamente el mismo archivo (> 1GB de tamaño) y exponerlo como un flujo de entrada? Me di cuenta de que si hay muchos subprocesos (> 32), el sistema comienza a contender por E/S y tiene muchas esperas de E/S.Java multihebra lectura de un único archivo grande
He considerado cargar el archivo en una matriz de bytes compartida por todos los subprocesos: cada subproceso crearía un ByteArrayInputStream, pero la asignación de una matriz de bytes de 1GB simplemente no funcionará.
También consideré usar un único FileChannel y cada subproceso creando un InputStream sobre él usando Channels.newInputStream(), sin embargo, parece que es el FileChannel el que mantiene el estado del InputStream.
¿Necesita cada subproceso todo el contenido del archivo? ¿O cada uno puede buscar los datos relevantes que necesita? –
Cada hilo necesita leer todo el archivo. – bob
El sistema tiene 8 gb de memoria y no me importaría asignar una matriz de 1 GB. Pero a la JVM simplemente no parece gustarle esto: usa 100% de CPU tratando de asignar la matriz durante mucho tiempo. – bob