2009-10-08 12 views
22

Necesito una estructura de mapa con respaldo de disco para usar en una aplicación Java. Se debe contar con los siguientes criterios:Recomiende un mapa persistente rápido y escalable - Java

  1. Capaz de almacenar millones de registros (incluso mil millones)
  2. de búsqueda rápida - la mayoría de las operaciones en el Mapa simplemente para ver si ya existe una clave. Esto y 1 arriba son los criterios más importantes. Debería haber un efectivo en el mecanismo de caché de la memoria para las claves usadas frecuentemente.
  3. Persistente, pero no necesita ser transaccional, puede vivir con alguna falla. 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 sola máquina.
  6. Fácil de configurar & de forma gratuita.
  7. No hay consultas relacionales necesitan claves

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 las claves asociadas a los datos). 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 han mejorado el rendimiento de consulta en mi configuración BDB existente mediante la reducción de la dependencia de las claves secundarias. Algunas consultas requerían una unión en dos claves secundarias y, al combinarlas en una clave compuesta, eliminé un nivel de indirección en la búsqueda que acelera las cosas.

+0

Una opción que estoy considerando es cambiar la forma en que uso mi implementación existente de BDB. Actualmente tengo una gran base de datos para todos mis registros. Sin embargo, debería ser capaz de dividir los datos en conjuntos y tener una base de datos por conjunto; si sé que en algún momento solo necesitaré acceso a ciertos conjuntos, entonces puedo mantener cerrados los conjuntos que no estoy usando, lo cual debería ayudar a bdb a administrar los datos de manera más eficiente para mí. – Joel

+0

he usado bdb je. para su criterio, es un gran ajuste. sin embargo, estaba realmente decepcionado con la fragilidad del mismo, y no lo recomendaría para el uso de producción. cualquier problema en el proceso de java provocó que el subsistema bdb requiriera un reinicio, ¡blech! – james

+0

No estoy seguro de lo que quiere decir con "la fragilidad" de BDB JE. BDB JE es escalable a Terabytes de datos y lo uso en sistemas de producción todo el tiempo. Es una maravillosa pieza de tecnología. – jasonmp85

Respuesta

3

Probablemente usaría una base de datos local. Como decir Bdb JE o HSQLDB. ¿Puedo preguntar qué está mal con este enfoque? Debe tener alguna razón para buscar alternativas.

En respuesta a los comentarios: Como problema de rendimiento y supongo que ya está utilizando JDBC para manejar esto, podría valer la pena intentar con HSQLB y leer el capítulo en Memory and Disk Use.

+1

+1 de acuerdo. Utilizaría una base de datos común y escribiría una buena API para los requisitos para que el servidor pueda cambiarse fácilmente. – flybywire

+0

Una vez que Bdb alcanza los límites de lo que se puede almacenar en caché en la memoria, descubro que se ralentiza inaceptablemente. Esto generalmente ocurre después de insertos de aproximadamente 1 mm. – Joel

+0

¿Qué hay de HSQLDB? Voy a adivinar los dos JDBC, así que deberías poder insertarlos sin modificar gran parte de tu código existente. valdría la pena leer: http://hsqldb.org/doc/2.0/guide/deployment-chapt.html#deployment_mem_disk-sect –

1

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

Como mencioné en un comentario, he utilizado satisfactoriamente 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 problema es la interfaz JDBC. Comparado con un HashMap simple, es torpe. A menudo termino escribiendo un envoltorio JDBC para el proyecto específico, que puede agregar mucho código repetitivo.

+0

Tengo serias dudas de que sqlite pueda escalar a tantos registros. –

+1

He utilizado satisfactoriamente SQLite con gigabytes de datos y tablas de cientos de millones de filas. Si piensas en la indexación correctamente, es muy rápido. –

0

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

+1

¿Es persistente? –

6

Es posible que desee consultar OrientDB.

1

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

Este ejemplo abreviado, tomada de the docs, muestra lo fácil que es para 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(); 
19

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

ACTUALIZACIÓN

Este proyecto ha evolucionado hasta convertirse en MapDB http://www.mapdb.org

6

Usted puede tratar de Crónicas Java desde http://openhft.net/products/chronicle-map/ Crónica mapa es un alto rendimiento, fuera del montón, clave-valor, en la memoria, persistieron Almacén de datos. Funciona como un mapa java estándar

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Cyclonecode

+2

@krister - Creo que este es un caso donde una pregunta menos que ideal generó una respuesta que violó la política de SO (la respuesta hizo un buen trabajo al responder la pregunta). En este caso, me inclino a avanzar en contra de la pregunta. – jww

2

A partir de hoy, utilizaría MapDB (sincronización basada en archivos o sincronizada o asincrónica) o Hazelcast. Posteriormente, tendrá que implementar su propia persistencia, es decir, respaldado por un RDBMS mediante la implementación de una interfaz Java. OpenHFT crónica podría ser otra opción. No estoy seguro de cómo funciona la persistencia allí ya que nunca lo usé, pero el reclamo de tener uno. OpenHFT está completamente fuera de pila y permite actualizaciones parciales de objetos (de primitivos) sin (des) serialización, lo que podría ser un beneficio de rendimiento.

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

Cuestiones relacionadas