2010-03-05 22 views
8

Actualmente estoy trabajando en un problema relacionado con la programación en el que intento hacer un hashmap masivo de datos. La clave para los datos es una implementación personalizada de baja memoria de una CharSequence que implementa hashCode() e iguala (...) y el valor es am Integer object.hashmap de memoria baja recomendado para la implementación de Java

Puede haber millones de entradas en esta tabla hash y pude reducir drásticamente el uso de memoria para el valor haciendo que el entero sea un puntero en un archivo a los datos que deseo hacer hash pero el problema es que la clave puede estar decenas de bytes (en promedio 25 bytes) y que las claves deben mantenerse en la memoria en la implementación predeterminada de HashMap.

Necesito un hashmap que tenga una sobrecarga de memoria baja y que posiblemente pueda ubicar las claves en el disco o, alternativamente, almacenar una representación hash de las claves. Si las claves son hash, entonces me preocuparían las colisiones hash.

Idealmente, me gustaría poder almacenar un millón de entradas en el mapa por 50MB de espacio de almacenamiento dinámico (una matriz de bytes de 25 bytes en la clave y un objeto entero en la parte de valor).

¿Alguien tiene alguna experiencia con mapas respaldados por un sistema de archivos de baja memoria que están optimizados para reducir la huella de las teclas?

Gracias,

Chris

+0

el espacio y el tiempo a menudo están en relación de intercambio. ¿Cuál es su requisito de rendimiento/escalabilidad para agregar, buscar, eliminar un nodo? puede usar una matriz si solo quiere poca memoria. –

+1

¿Suena como que quieres es una base de datos en la memoria? –

Respuesta

3

Puede usar el mapa hash de Java y escribir una clase FileKey que tome un RandomAccessFile, desplazamiento y longitud, precomputa el hash en la construcción y que implementa Comparable leyendo los datos del archivo solo para la comparación.

En conjunción con un caché MRU simple, puede mantener algunas claves en la memoria utilizando otro hashmap que está codificado en las mismas teclas, pero que utiliza un comparador personalizado que compara solo los valores de desplazamiento y longitud (no el archivo datos).

1

Creo que el valor predeterminado HashSet no es un mal camino, haga el par clave-valor usted mismo (para que no tenga que envolverlos en un objeto adicional). Es bastante eficiente con la memoria de esa manera; realmente solo requiere acerca de (1/loadFactor)^(3/2) * 4 bytes más de memoria en la parte superior de su objeto clave + 4 bytes para el valor. En la práctica, esto debería agregar algo así como 8 bytes de sobrecarga por entrada. (Puede reducir esto aún más si sabe de antemano cuántas teclas va a almacenar.)

Cuestiones relacionadas