Pregunta

Necesito una estructura de mapa respaldada por disco para usar en una aplicación Java. Debe tener los siguientes criterios:

  1. Capaz de almacenar millones de registros (incluso miles de millones)
  2. Búsqueda rápida: la mayoría de las operaciones en el mapa simplemente verán si ya existe una llave. Esto, y 1 arriba son los criterios más importantes. Debe haber un mecanismo de almacenamiento en caché de memoria para las teclas de uso frecuente.
  3. Persistente, pero no necesita ser transaccional, puede vivir con alguna falla. es decir, feliz de sincronizar con disco periódicamente, y no necesita ser transaccional.
  4. Capaz de almacenar tipos primitivos simples, pero no necesito almacenar objetos serializados.
  5. No es necesario distribuirlo, es decir, ejecutará todo en una máquina.
  6. Fácil de configurar y gratis para usar.
  7. 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 verificar si existe una clave (es decir, no necesitará leer los datos asociados con las claves). Cada registro se actualizará una vez que los registros no se eliminen.

Actualmente uso BDB JE pero estoy buscando otras opciones.


Actualizar

Desde entonces, he mejorado el rendimiento de la consulta en mi configuración BDB existente al reducir la dependencia de las claves secundarias. Algunas consultas requirieron una unión en dos claves secundarias y al combinarlas en una llave compuesta eliminé un nivel de indirección en la búsqueda que acelera las cosas muy bien.

¿Fue útil?

Solución

Probablemente usaría una base de datos local. Como decir BDB JE o Hsqldb. ¿Puedo preguntar qué hay de malo en este enfoque? Debe tener alguna razón para buscar alternativas.

En respuesta a los comentarios: como el rendimiento del problema y supongo que ya está usando JDBC para manejar esto, podría valer la pena probar HSQLB y leer el capítulo sobre Uso de memoria y disco.

Otros consejos

JDBM3 Hace exactamente lo que estás buscando. Es una biblioteca de mapas respaldados por disco con API realmente simple y alto rendimiento.

ACTUALIZAR

Este proyecto ahora ha evolucionado a MAPDB http://www.mapdb.org

Es posible que desee investigar Orientdb.

Puedes probar Java Chronicles de http://openhft.net/products/chronicle-map/CHRONICLE MAP es un almacén de datos persistido de alto rendimiento, fuera de tiempo, valor clave, en memoria. Funciona como un mapa de Java estándar

A partir de hoy usaría MAPDB (Sync o async basado/copiado por archivo) o Avelada. En el posterior, tendrá que implementar su propia persistencia, es decir, respaldado por un RDBMS implementando una interfaz Java. Abierto Chronicle podría ser otra opción. No estoy seguro de cómo funciona la persistencia allí, ya que nunca la usé, pero la afirmación de tener una. OpenHFT está completamente apagado y permite actualizaciones parciales de objetos (de primitivas) sin (de) 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 del tiempo o el tamaño. OpenHFT está apagado y podría considerarse si solo necesita persistencia para los reinicios de JVM.

He encontrado Gabinete de Tokio Para ser un hash/mapa persistente simple, y rápido para configurar y usar.

Este ejemplo abreviado, tomado de los documentos, muestra cuán simple 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();

Sqlite hace esto. Escribí un envoltorio por usarlo de Java: http://zentus.com/sqlitejdbc

Como mencioné en un comentario, he usado con éxito SQLite con gigabytes de datos y tablas de cientos de millones de filas. Si piensa en la indexación correctamente, es muy rápido.

El único dolor es la interfaz JDBC. En comparación con un hashmap simple, es torpe. A menudo termino escribiendo un JDBC-Wrapper para el proyecto específico, que puede sumar mucho código de Boilerplate.

Jboss (árbol) caché es una gran opción. Puedes usarlo independiente de JBoss. Muy robusto, performador y flexible.

pienso Fragmentos hibernados Puede cumplir fácilmente con todos sus requisitos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top