2010-09-30 15 views
7

Estoy buscando una estructura hash persistente en java, un simple almacén de clave-valor, donde la clave es una cadena única y el valor es un int. El valor de una clave se incrementará cada vez que se agregue una clave existente a la tienda.Java: ¿gran estructura hash persistente?

Necesito que sea bastante grande, posiblemente 500m - 1bn de llaves. He estado evaluando el tokyo-cabinet http://fallabs.com/tokyocabinet/javadoc/, pero no estoy seguro de lo bien que se escalará: los tiempos de inserción parecen ser más largos a medida que el hash crece.

¿Alguna idea sobre lo que podría ser apropiado?

Gracias

Editar: el fin de reducir/S de disco que voy a ser el almacenamiento en caché de datos en un HashMap en memoria, a continuación, actualizar el hash persistente de una sola vez cuando la caché crece a una cierto tamaño

Edit2: Una de las razones de la persistencia es que tengo una memoria RAM limitada, 4 GB, por lo que no puedo incluir una estructura grande en la memoria.

+0

Pregunta interesante. –

+0

Tiene el tipo de problema que estará limitado por su elección de hardware. Debes diseñar tu software para evitar esta limitación, sin embargo, dado que solo te has permitido 4 bytes por entrada, vas a sufrir porque el rendimiento del disco puede ser 1000 veces más lento que la memoria principal. –

Respuesta

5

I thing Megamap es lo que está buscando: http://megamap.sourceforge.net/. He aquí una breve descripción de MegaMap de su página de inicio:

MegaMap es una implementación de Java de un mapa (o tabla hash) que puede almacenar un cantidad ilimitada de datos, sólo limitado por la cantidad de espacio disponible en disco . Los objetos almacenados en el mapa son persistidos en el disco. El buen rendimiento es logrado por una memoria caché en memoria. El MegaMap puede, por todos los motivos prácticos , considerarse una implementación de mapa con espacio de almacenamiento ilimitado .

+0

Parece interesante, lo comprobaré, gracias –

+0

Gracias de nuevo por la sugerencia, pero parece no haber sido conservada. actualizado desde 2005 :( –

+0

Me gustaría echar un vistazo a ehcache u otras bibliotecas de terracota, probablemente una de ellas te puede ayudar. MegaMap fue desarrollado en la parte superior de ehcache, por lo que es una buena dirección para buscar. Tal vez ehcache puede hacerlo out-of-the-box. – Skarab

2

Use una base de datos, no un hash. Incluso para una base de datos 500M filas es cada vez más grande. ¿Cuántas actualizaciones espera por segundo?

+0

¿Sería apropiado un NoSQL db, por ejemplo, MongoDB? Estas son esencialmente una tienda clave-valor ¿no? –

0

Por lo tanto, si entiendo correctamente, Redis podría ser una opción. Puede emitir comandos INCR [clave] para incrementar atómicamente el valor asociado con esa clave. Si la clave no existe, se establece en cero y luego se incrementa (lo que da como resultado uno). De acuerdo con el docs, INCR es una operación de tiempo constante. La velocidad es un objetivo de diseño primario para Redis.

Redis es capaz de mantenerse en el archivo, y puede controlar los parámetros sobre cómo sucede eso.

+0

Suena como que Redis podría tener que caber completamente en la memoria.De las notas "Para ser muy rápido pero al mismo tiempo persistente, todo el conjunto de datos se toma en la memoria". Estoy limitado por 4 GB de RAM. –

+0

Tiene capacidades de memoria virtual, http://code.google.com/p/redis/wiki/VirtualMemoryUserGuide. Tampoco tiene que ejecutarse localmente en el mismo host que su JVM. Por supuesto, depende de la libertad que le dé su organización en términos de lo que puede instalar en su entorno de producción ... – romacafe

+0

Bueno, existe esta advertencia: "ADVERTENCIA: Como las claves no se pueden intercambiar, Redis no lo hará. ser capaz de respetar la configuración de vm-max-memory si las claves solo están usando más espacio que el límite ". Supongo que eso excluye a Redis por ti, a menos que obtengas una caja realmente grande para ejecutarla ... – romacafe

0

Creo que Memcached es una buena opción para su caso junto con una base de datos adecuada en el back-end.

Cuestiones relacionadas