2010-04-16 22 views
26

¿Tiene Java (o hay una biblioteca disponible) que me permite tener un HashMap basado en disco? No necesita ser atómico ni nada, pero se accederá a través de varios subprocesos y no se bloqueará si dos acceden al mismo elemento al mismo tiempo.HashMap basado en disco

¿Alguien sabe de algo?

+1

¿Qué es un "mapa basado en disco (Hash)"? – Progman

+0

El sistema de archivos, tal vez? –

+1

@Progman Algo así como el módulo http://docs.python.org/library/shelve.html#module-shelve de python es lo que estoy buscando. – synic

Respuesta

10

O properties files o Berkeley DB podría ser lo que estás buscando. El java.util.Properties implementa java.util.Map y proporciona métodos a load desde y store a un archivo. La base de datos de Berkeley a menudo se recomienda como un almacén de datos de pares clave-valor liviano.

+0

Creo que las propiedades serán perfectas. No sé por qué pensé que tenía que complicar esto, ja. – synic

+1

Las propiedades no son inseguras, lo que dijiste que necesitabas. Solo imagine dos hilos escribiendo el archivo en el disco al mismo tiempo. Puede programar eso o echar un vistazo a http://ehcache.org/, que también proporcionará un rendimiento mucho mejor si es necesario. – zockman

+0

Las propiedades amplían Hashtable, por lo que es seguro para subprocesos, solo que las lecturas simultáneas están sincronizadas, por lo que el rendimiento duele. – javaPhobic

7

Parece que necesita algo cercano a un peso ligero. ¿Ha mirado/considerado Java DB?? Un DB ligero con una sola tabla indexada sería básicamente un mapa de hash basado en disco y seguro para hilos.

+1

Intenté exactamente esto en un punto: en realidad pasar de la mentalidad de un mapa hash a un mapa hash basado en disco a un DB que es esencialmente un mapa hash basado en disco. Hubo algunos muy buenos que pueden incluir el frasco y usarlo, y eso fue hace más de 5 años. Aquí hay una buena discusión de las bases de datos: http://www.linkedin.com/answers/technology/software-development/TCH_SFT/1207-3692603 –

+0

En realidad ya uso sqlite para este problema, pero realmente todo lo que necesito es solo una clave de cadena de hilos/almacén de valores. – synic

4

Project Voldemort es también un "Hashmap" realmente rápido/escalable/de replicación. Se utiliza en LinkedIn una actuación también es bastante bueno:

Una cita de su sitio:

Aquí es el rendimiento que vemos desde un cliente multihilo sola hablar con un único servidor en el que el "caliente "Los datos conjunto está en la memoria bajo artificialmente carga pesada en el laboratorio de rendimiento:

Lecturas: 19384 req/seg
escribe: 16559 req/seg

7

JDBM2 es exactamente lo que estás preguntando. Proporciona un HashMap respaldado por almacenamiento en disco (entre otros mapas). Es rápido, seguro para subprocesos y la API es realmente simple.

+1

Tuve el mismo problema y JDBM2 fue perfecto para resolverlo. ¡Muchas gracias señor! –

28

MapDB

MapDB proporciona TreeMap concurrente y HashMap respaldado por almacenamiento en disco o fuera de heap-memoria. Es un motor de base de datos Java incorporado rápido, escalable y fácil de usar. Está repleto de características tales como transacciones, serialización eficiente en el uso del espacio, caché de instancias y compresión/encriptación transparente. También tiene un rendimiento sobresaliente que solo rivaliza con los motores db incorporados nativos.

http://www.mapdb.org/

jdbm2

Embedded base de datos de valor de clave de Java.

https://code.google.com/p/jdbm2/

2

Así que el año es ahora 2016. Y si alguien está buscando para hacer frente a este problema, descubrí que el bajo entornos de nivel de API en Xodus de JetBrains funciona para este mismo propósito, utilizando su lambdas computeInTransaction tienda.

De acuerdo, no es tan elegante como tener una instancia de Map pura, pero funcionó para mi caso de uso.

Otra opción reciente es usar H2's MVStore storage engine que hace lo mismo, pero creo que está más adaptado a la base de datos.

¡Salud!

3

Chronicle Map implementa ConcurrentMap y persiste los datos en el disco a través de la asignación de la memoria a un archivo.

Crónica mapa es conceptualmente muy similar a MapDB (API proporciona constructor similar y Map interfaz), pero Crónica mapa es times faster que MapDB y tiene mucho mejor concurrencia (Crónica mapa utiliza altamente rayas cerraduras de varios niveles de spin).