2011-03-17 27 views
5

Estoy trabajando en un proyecto donde se realizan muchas búsquedas en un gran conjunto de datos, así que me estoy dando cuenta de que usar una estructura de base de datos tradicional no funciona, ya que necesito leer tablas en un formato HashMap, que permanece en memoria todo el tiempo, para poder ejecutar consultas en la cantidad de tiempo necesaria para el rendimiento de la aplicación.Java, forma recomendada de persistir HashMaps para un almacenamiento permanente y confiable?

Me pregunto cuál es el proceso recomendado para actualizar un HashMap con respecto a la velocidad de recuperación de su estado persistente y respecto a minimizar el código adicional necesario (ya que ahora estoy escribiendo clases personalizadas que leen los datos necesarios de las tablas de DB y luego crear un HashMap anidado que refleje la estructura de datos en la que lo necesito para que se pueda buscar lo más rápido posible. No estoy seguro de si simplemente escribir en un archivo de texto sería una forma adecuada de hacerlo con respecto a asegurarme de que los datos se conserva y no corrompido. Cualquier consejo se agradece

+1

Esto es probablemente relevante: http://stackoverflow.com/questions/3832622/java-large-persistent-hash-structure –

Respuesta

3

Ha considerado el uso de bases de datos de valores clave (como Redis o Riak)?

+0

No estoy familiarizado con esos pero definitivamente voy a comprobarlo, gracias por la sugerencia – Rick

2

Si está pegando el contenido de su base de datos en una estructura de hash con el fin de acelerar las búsquedas contra los contenidos DB Creo que se probablemente esté tomando el enfoque equivocado. No sé lo que está tratando de hacer exactamente, pero quizás usar un índice como Lucene ¿es apropiado? Este es un índice maduro y altamente optimizado y manejará cosas como el almacenamiento en memoria caché de consultas frecuentes.

Alternativamente, eche un vistazo a BerkeleyDB que es básicamente una base de datos hash respaldada por disco. También muy rápido. (Aunque tenga en cuenta que Oracle puede estar requiriendo una licencia para esto para algunos casos de uso ahora).

Las únicas advertencias a Lucene y BerkeleyDB es que requerirán un poco de sobrecarga para configurar. Así que mi última sugerencia es Tokyo-Cabinet que es un hash respaldado por disco bastante decente, muy rápido y muy simple de usar. Básicamente solo incluya el jar en la ruta de su clase y úselo como un HashMap:

import tokyocabinet.HDB; 

.... 

String dir = "/path/to/my/dir/"; 
HDB hash = new HDB(); 

// open the hash for read/write, create if does not exist on disk 
if (!hash.open(dir + "unigrams.tch", HDB.OWRITER | HDB.OCREAT)) { 
    throw new IOException("Unable to open " + dir + "unigrams.tch: " + hash.errmsg()); 
} 

// Add something to the hash 
hash.put("blah", "my string"); 

// Close it 
hash.close(); 

Y eso es todo. Todo lo que pegue en el hash persiste en el disco y puede volver a cargarlo más tarde. Y no se preocupe por la velocidad, las optimizaciones en memoria se manejan para usted detrás de escena.

Editar: Parece que Tokyo Cabinet ha sido reemplazado por Kyoto Cabinet.

Editar 2: Usted no dice qué DB está utilizando, pero si MySQL no full text search no funciona para usted?

+0

Después de investigar más sobre esto, creo que usar una base de datos relacional tiene desventajas definidas, en mi caso, en comparación con una base de datos NoSQL (algo que acabo de familiarizar con el concepto de).Estoy trabajando en una aplicación de motor de búsqueda, así que creo que es necesario alejarse de la base de datos relacional, de todos modos, gracias por la información, Kyoto Cabinet es algo que definitivamente estoy considerando usar ahora. – Rick

Cuestiones relacionadas