Bueno, no veo una razón para no usar java.nio.MappedByteBuffer incluso si los archivos son más grandes que Integer.MAX_VALUE.
Evidentemente, no se le permitirá definir un solo MappedByteBuffer para todo el archivo. Pero podría tener varios MappedByteBuffers accediendo a diferentes regiones del archivo.
La definición de la posición y el tamaño de FileChannenel.map es de tipo long, lo que implica que puede proporcionar valores más Integer.MAX_VALUE, lo único que tiene que cuidar es que el tamaño de la memoria intermedia no lo hará ser más grande que Integer.MAX_VALUE.
Por lo tanto, se podría definir varios mapas de la siguiente manera:
buffer[0] = fileChannel.map(FileChannel.MapMode.READ_WRITE,0,2147483647L);
buffer[1] = fileChannel.map(FileChannel.MapMode.READ_WRITE,2147483647L, Integer.MAX_VALUE);
buffer[2] = fileChannel.map(FileChannel.MapMode.READ_WRITE, 4294967294L, Integer.MAX_VALUE);
...
En resumen, el tamaño no puede ser más grande que Integer.MAX_VALUE, pero la posición de inicio puede estar en cualquier lugar en su archivo.
En el libro Java NIO, el autor Ron Hitchens afirma:
Acceso a un archivo a través del mecanismo mapeo de memoria puede ser mucho más eficiente que la lectura o escritura de datos por medios convencionales, incluso cuando usando canales. No es necesario realizar llamadas explícitas del sistema , que pueden ser que consumen mucho tiempo. Más importante aún, el sistema de memoria virtual del sistema operativo guarda automáticamente en memoria caché las páginas de memoria . Estas páginas se almacenarán en la memoria caché usando la memoria del sistema y no serán las que consuman espacio de la memoria de la JVM montón.
Una vez que una página de memoria se ha hecho válida (traídos de disco), que puede ser visitada de nuevo a velocidad completa por hardware sin la necesidad de realizar otra llamada sistema para obtener los datos. Grandes, archivos estructurados que contienen índices u otras secciones a las que se hace referencia o se actualizan frecuentemente pueden beneficiarse tremendamente de la asignación de memoria. Cuando combinado con bloqueo de archivos para proteger secciones críticas y control transaccional atomicity, comienza a ver cómo los buffers mapeados en la memoria pueden ser poner un buen uso.
Realmente dudo que encuentre una API de terceros que haga algo mejor que eso. Quizás pueda encontrar una API escrita sobre esta arquitectura para simplificar el trabajo.
¿No crees que este enfoque debería funcionar para ti?
Déjame ver si entiendo, quiere decir que java.nio.MemoryByteBuffer no es suficiente, ya que sólo puede contener En teger.MAX_VALUE bytes. ¿Es eso así? –
Eso es alrededor de 2 gigabytes de memoria en un búfer. ¿Qué tan grande es su archivo y cuánta memoria tiene disponible? –
¿Qué/cómo quieres almacenar? Por lo general, está almacenando en búfer una secuencia, pero si desea acceder a un punto arbitrario en un archivo de múltiples conciertos, ¿qué datos exactamente desea almacenar? Supongo que la respuesta a eso le dará su solución (por ejemplo, "siempre quiero precargar 1K de datos después del punto aleatorio). –