¿Cómo hacer uso de la caché del sistema de archivos en Java o Python?

Una publicación reciente del blog en el sitio web de Elasticsearch habla de las características de su nueva versión 1.4 beta.

Tengo mucha curiosidad acerca de cómo hacen uso del caché del sistema de archivos:

Las versiones recientes han agregado soporte para los valores de doc. Esencialmente, los valores de documento proporcionan la misma función que los datos de campo en memoria, pero se escriben en el disco en el momento del índice. El beneficio que proporcionan es que consumen muy poco espacio de almacenamiento dynamic. Los valores del documento se leen desde el disco, en lugar de desde la memoria. Si bien el acceso al disco es lento, los valores de doc se benefician de la caché del sistema de archivos del kernel. El caché del sistema de archivos, a diferencia del montón de JVM, no está limitado por el límite de 32 GB. Al cambiar los datos de campo del montón al caché del sistema de archivos, puede usar montones más pequeños, lo que significa recolecciones de basura más rápidas y, por lo tanto, nodos más estables.

Antes de esta versión, los valores de documento eran significativamente más lentos que los datos de campo en memoria. Los cambios en esta versión han mejorado significativamente el rendimiento, haciéndolos casi tan rápidos como los datos de campo en memoria.

¿Significa esto que podemos manipular el comportamiento de la memoria caché del sistema de archivos en lugar de esperar el efecto del sistema operativo de forma pasiva? Si es así, ¿cómo podemos hacer uso del caché del sistema de archivos en el desarrollo normal de aplicaciones? Por ejemplo, si estoy escribiendo un progtwig Python o Java, ¿cómo puedo hacer esto?

El caché del sistema de archivos es un detalle de implementación relacionado con el funcionamiento interno del sistema operativo que es transparente para el usuario final. No es algo que necesite ajustes o cambios. Lucene ya utiliza el caché del sistema de archivos cuando administra los segmentos del índice. Cada vez que se indexa algo en Lucene (a través de Elasticsearch), esos documentos se escriben en segmentos, que primero se escriben en el caché del sistema de archivos y luego, después de cierto tiempo (cuando el registro de tránsito, una forma de realizar un seguimiento de los documentos que se indexan) es lleno, por ejemplo) el contenido del caché se escribe en un archivo real. Pero, mientras que los documentos a indexar están en el caché del sistema de archivos, todavía se puede acceder a ellos.

Esta mejora en la implementación de los valores de documento se refiere a esta característica como la posibilidad de usar la memoria caché del sistema de archivos ahora, a medida que se leen desde el disco, se ponen en la memoria caché y se accede desde allí, en lugar de ocupar espacio de almacenamiento dynamic.

En esta excelente publicación del blog se describe cómo se accede a este caché del sistema de archivos:

En nuestros enfoques anteriores, dependíamos del uso de un syscall para copiar los datos entre el caché del sistema de archivos y nuestro montón local de Java. ¿Qué hay de acceder directamente a la memoria caché del sistema de archivos? ¡Esto es lo que hace mmap!

Básicamente, mmap hace lo mismo como manejar el índice de Lucene como un archivo de intercambio. El mmap () syscall le dice al kernel O / S que mapee virtualmente todos nuestros archivos de índice en el espacio de direcciones virtuales descrito anteriormente, y que se vean como RAM disponible para nuestro proceso Lucene. Luego podemos acceder a nuestro archivo de índice en el disco como si fuera una matriz de byte [] grande (en Java, esto está encapsulado por una interfaz ByteBuffer para que sea seguro para su uso con el código Java). Si accedemos a este espacio de direcciones virtuales desde el código de Lucene, no necesitamos hacer ninguna llamada al sistema, la MMU y la TLB del procesador se encargan de todo el mapeo. Si los datos solo están en el disco, la MMU causará una interrupción y el kernel O / S cargará los datos en el caché del sistema de archivos. Si ya está en el caché, MMU / TLB lo asigna directamente a la memoria física en el caché del sistema de archivos.

En relación con los medios reales de usar mmap en un progtwig Java, creo que esta es la clase y el método para hacerlo .