icon - Recomiende un Mapa persistente rápido y escalable-Java
my icon java (9)
A partir de hoy utilizaría MapDB (sincronización basada en archivos / respaldada o asíncrona) o Hazelcast . Más adelante tendrá que implementar su propia persistencia, es decir, respaldado por un RDBMS mediante la implementación de una interfaz Java. OpenHFT crónica OpenHFT podría ser otra opción. No estoy seguro de cómo funciona la persistencia allí, ya que nunca la usé, pero reclamo tener uno. OpenHFT está completamente fuera de lugar y permite actualizaciones parciales de objetos (de primitivas) sin (des) serialización, lo que podría ser un beneficio de rendimiento.
NOTA: Si necesita su disco de mapa basado en problemas de memoria, la opción más fácil es MapDB. Hazelcast podría usarse como un caché (distribuido o no) que le permite desalojar elementos del montón después de un tiempo o tamaño. OpenHFT está fuera del montón y podría ser considerado si solo necesita persistencia para reinicios jvm.
Necesito una estructura de mapa respaldada por disco para usar en una aplicación Java. Debe tener los siguientes criterios:
- Capaz de almacenar millones de registros (incluso miles de millones)
- Búsqueda rápida: la mayoría de las operaciones en el mapa simplemente verán si ya existe una clave. Este, y el 1 anterior son los criterios más importantes. Debe haber un mecanismo efectivo de almacenamiento en caché para las claves de uso frecuente.
- Persistente, pero no necesita ser transaccional, puede vivir con algún fracaso. es decir, feliz de sincronizar con el disco periódicamente y no necesita ser transaccional.
- Capaz de almacenar tipos primitivos simples, pero no necesito almacenar objetos serializados.
- No necesita ser distribuido, es decir, se ejecutará todo en una máquina.
- Fácil de configurar y de uso gratuito.
- No se requieren consultas relacionales
Las claves de los registros serán cadenas o largos. Como se describió anteriormente, las lecturas serán mucho más frecuentes que las escrituras, y la mayoría de las lecturas serán simplemente para verificar si existe una clave (es decir, no será necesario leer los datos asociados a las claves). Cada registro se actualizará una sola vez y los registros no se eliminarán.
Actualmente uso Bdb JE pero estoy buscando otras opciones.
Actualizar
Desde entonces, he mejorado el rendimiento de las consultas en mi configuración BDB existente al reducir la dependencia de las claves secundarias. Algunas consultas requerían una combinación en dos claves secundarias y al combinarlas en una clave compuesta eliminé un nivel de direccionamiento indirecto en la búsqueda que acelera las cosas muy bien.
Creo que los fragmentos de hibernación pueden cumplir fácilmente todos tus requisitos.
Es posible que desee mirar en OrientDB .
He encontrado que el Gabinete de Tokio es un Hash / Map simple y persistente, y de rápida configuración y uso.
Este ejemplo abreviado, tomado de los documentos , muestra lo sencillo que es guardar y recuperar datos de un mapa persistente:
// create the object
HDB hdb = new HDB();
// open the database
hdb.open("casket.tch", HDB.OWRITER | HDB.OCREAT);
// add item
hdb.put("foo", "hop");
hdb.close();
Probablemente usaría una base de datos local. Como decir Bdb JE o HSQLDB . ¿Puedo preguntar qué está mal con este enfoque? Debes tener alguna razón para estar buscando alternativas.
En respuesta a los comentarios: como el rendimiento del problema y supongo que ya está utilizando JDBC para manejar esto, podría valer la pena probar HSQLB y leer el capítulo sobre la memoria y el uso del disco .
Puede probar Java Chronicles desde http://openhft.net/products/chronicle-map/ Chronicle Map es un almacén de datos persistente de alto rendimiento, fuera de pila, clave-valor, en memoria. Funciona como un mapa java estándar
SQLite hace esto. Escribí un contenedor para usarlo desde Java: http://zentus.com/sqlitejdbc
Como mencioné en un comentario, he utilizado con éxito SQLite con gigabytes de datos y tablas de cientos de millones de filas. Si piensas en la indexación correctamente, es muy rápido.
El único dolor es la interfaz JDBC. En comparación con un simple HashMap, es torpe. A menudo termino escribiendo un contenedor JDBC para el proyecto específico, que puede agregar un montón de código repetitivo.
JBoss (árbol) Caché es una gran opción. Puedes usarlo de forma independiente desde JBoss. Muy robusto, performante y flexible.