Recomendar un mapa persistente rápido y escalable-Java


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 para ver si una clave ya existe. Este y el anterior 1 son los criterios más importantes. Debe haber un mecanismo efectivo de almacenamiento en caché de memoria para las claves de uso frecuente.
  3. Persistente, pero no necesita ser transaccional, puede vivir con algunos fallo. es decir, feliz de sincronizar con el disco periódicamente, y no necesita ser transaccional.
  4. Capaz de almacenar tipos primitivos simples, pero no necesito almacenar objetos serializados.
  5. No necesita ser distribuido, es decir, se ejecutará todo en una máquina.
  6. Fácil de configurar y de uso gratuito.
  7. No se requieren consultas relacionales

Las claves de los registros serán cadenas o longs. 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.


Actualización

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 requirieron una unión en dos claves secundarias y combinándolas en una clave compuesta eliminé una nivel de indirección en la búsqueda que acelera las cosas muy bien.

Author: Joel, 2009-10-08

9 answers

Probablemente usaría una base de datos local. Como decir Bdb JE o HSQLDB. ¿Puedo preguntar qué tiene de malo este enfoque? Usted debe 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 Uso de memoria y disco.

 3
Author: Michael Lloyd Lee mlk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-03 10:17:14

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

ACTUALIZACIÓN

Este proyecto se ha convertido en MapDB http://www.mapdb.org

 19
Author: Andrejs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-15 08:59:14

Es posible que desee buscar en OrientDB.

 6
Author: Juha Syrjälä,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-06-12 09:54:16

Puedes probar Java Chronicles desde http://openhft.net/products/chronicle-map / Chronicle Map es un almacén de datos persistente de alto rendimiento, fuera del montón, clave-valor, en memoria. Funciona como un mapa java estándar

 6
Author: Harvinder Singh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-24 15:22:29

A partir de hoy usaría MapDB (sincronización basada en archivos/respaldada o asíncrona) o Hazelcast. En el último tendrá que implementar su propia persistencia, es decir, respaldado por un RDBMS mediante la implementación de una interfaz Java. OpenHFT chronicle podría ser otra opción. No estoy seguro de cómo funciona la persistencia allí ya que nunca lo usé, pero la afirmación de tener uno. OpenHFT está completamente fuera de montón y permite actualizaciones parciales de objetos (de primitivas) sin (des)serialización, que podría ser un beneficio de rendimiento.

NOTA: Si necesita su mapa basado en disco debido a problemas de memoria, la opción más fácil es MapDB. Hazelcast se puede usar como caché (distribuido o no) que le permite desalojar elementos del montón después del tiempo o el tamaño. OpenHFT está desactivado y podría considerarse si solo necesita persistencia para reinicios de jvm.

 3
Author: KIC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-12 17:50:14

He encontrado que Tokyo Cabinet es un simple Hash/Mapa persistente, y rápido de configurar y usar.

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();
 1
Author: Joel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-08 12:06:43

SQLite hace esto. Escribí un wrapper para usarlo desde Java: http://zentus.com/sqlitejdbc

Como mencioné en un comentario, he utilizado SQLite con éxito 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. Comparado con un simple HashMap, es torpe. A menudo termino escribiendo un JDBC-wrapper para el proyecto específico, que puede agregar un montón de repeticiones codificar.

 1
Author: David Crawshaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-22 16:22:15

JBoss (tree) Cache es una gran opción. Puede usarlo de forma independiente desde JBoss. Muy robusto, de rendimiento y flexible.

 0
Author: james,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-10-08 15:26:02

Creo que Los fragmentos de hibernación pueden satisfacer fácilmente todos sus requisitos.

 0
Author: Boris Pavlović,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-04 06:52:14