2011-10-09 6 views

Respuesta

9

Estoy desarrollando una solución que sea mucho más rápido, pero yo no recomendaría que lo utilice por el momento, ya que sólo una prueba de concepto En este punto.

http://vanillajava.blogspot.com/2011/09/new-contributors-to-hugecollections.html

Sin embargo, si usted tiene un requisito específico, puede ser más fácil de codificar por sí mismo, para usar ByteBuffers directos o archivos de memoria asignada.

p. Ej.

// using native order speeds access for values longer than a byte. 
ByteBuffer bb = ByteBuffer.allocateDirect(1024*1024*1024).order(ByteOrder.nativeOrder()); 
// start at some location. 
bb.position(0); 
bb.put((byte) 1); 
bb.putInt(myInt); 
bb.putDouble(myDouble); 

// to read back. 
bb.position(0); 
byte b = bb.get(); 
int i = bb.getInt(); 
double d = bb.getDouble(); 

Puede hacer lo mismo para los archivos de memoria mapeados. Los archivos mapeados en memoria no cuentan para el límite directo de memoria y no usan espacio de intercambio ascendente.

¿Estás seguro de que BigMemory no hará el trabajo por ti?

+2

Me gustaría una herramienta gratuita para que BigMemory no tenga pies. No es tan fácil codificarlo solo porque necesito agregar y eliminar datos del caché, así que tendré que codificar una lógica complicada similar a GC en un buffer asignado. – Tema

+1

Avance rápido 6 años, este proyecto ahora se llama [Mapa de la crónica] (https://github.com/OpenHFT/Chronicle-Map) – leventov

14

Hay una muy buena solución de caché llamada MapDB (anteriormente JDBM4). Es compatible con HashMap y TreeMap, pero solo es una aplicación incrustada. También es compatible con la caché persistente basada en archivos.

Ejemplo de caché fuera del montón:

DB db = DBMaker.newDirectMemoryDB().make(); 
ConcurrentNavigableMap<Integer, String> map = db.getTreeMap("MyCache"); 

o persistente basado en archivos de caché:

DB db = DBMaker.newFileDB(new File("/home/collection.db")).closeOnJvmShutdown().make(); 
ConcurrentNavigableMap<Integer,String> map = db.getTreeMap("MyCache"); 
+1

Es una solución con respaldo de disco. No es realmente por lo que estoy preguntando. – Tema

+4

@Tema: admite ambos. –

+0

Vale la pena mencionar que MapDB se desarrolló en Kotlin e impondrá una dependencia en su tiempo de ejecución. –

8

He tenido esta pregunta, así que yo sólo voy a actualizar las respuestas anteriores con mis hallazgos

yo encontramos este hilo desde quora que también habla de la misma pregunta:

http://www.quora.com/JVM/Whats-the-best-open-source-solution-for-java-off-heap-cache

La solución diferente, que parece ser un buen ajuste, además de la directmemory (que en realidad no se ha actualizado en el el año pasado) se

  • MapDB - esto parece ser una solución muy completa que hace mucho más que el almacenamiento en caché fuera del montón y es compatible con una gran cantidad de características
  • enorme Colecciones: esta parece ser una aplicación mucho menos compleja que MapDB, que se centra en la asignación de datos no acumulados extendiendo el mapa y las mareas paralelas. Un proyecto de tenedor de esto, destinado a apuntar a Java 8, es Chronicle-Map.Un buen artículo sobre esto es http://blog.shinetech.com/2014/08/26/using-hugecollections-to-manage-big-data/
  • SpyMemcached - esta es una implementación sencilla de un solo hilo con buena reputación en github.
  • xmemcached - esto también tiene una buena reputación en github, pero no parece ser muy hablado.
  • rápido serialización - también se centró en reimplementar serialización Java con el foco en el uso fuera del montón de memoria - http://ruedigermoeller.github.io/fast-serialization/

Sin embargo, estaría interesado, además de encontrar una aplicación bastante grande que está utilizando cualquiera de estos tres: directmemory, SpyMemcached, xmemcached. Si encuentro uno, actualizaré esta respuesta.

3

Esta implementación de un caché de Java fuera del montón utiliza directo a memoria y proporciona un buen rendimiento en una biblioteca de Java de peso ligero:

https://github.com/snazy/ohc

Tome un vistazo a la sección de referencia para los números de rendimiento. Está licenciado bajo Apache 2.

Cuestiones relacionadas