java - documentacion - HashMap basado en disco
jpa java 8 (8)
¿Tiene Java (o hay una biblioteca disponible) que me permita tener un HashMap basado en disco? No necesita ser atómico ni nada, pero se accederá a través de varios subprocesos y no debería bloquearse si dos acceden al mismo elemento al mismo tiempo.
Alguien sabe de algo?
Así que ahora es el año 2016. Y si alguien está tratando de resolver este problema, descubrí que la API de entornos de bajo nivel en Xodus de JetBrains funciona para este mismo propósito, utilizando sus lambdas de la tienda computeInTransaction
.
Por supuesto, no es tan ingenioso como tener una instancia de Map
puro, pero funcionó para mi caso de uso.
Otra opción reciente es usar el motor de almacenamiento MVStore
de H2 que hace lo mismo, pero creo que está más adaptado a la base de datos en sí.
¡Aclamaciones!
En 2018
el almacén de key value
persistente más ligero es la base de datos H2 con su MVStore :
El MVStore es un almacén de valor-clave estructurado y de registro persistente. Está previsto que sea el próximo subsistema de almacenamiento de H2, pero también puede usarse directamente dentro de una aplicación, sin usar JDBC o SQL.
MVStore significa "tienda multi-versión".
Cada tienda contiene una serie de mapas a los que se puede acceder mediante la interfaz java.util.Map.
Tanto la persistencia basada en archivos como la operación en memoria son compatibles.
Está pensado para ser rápido, simple de usar y pequeño.
Se admiten operaciones de lectura y escritura concurrentes.
Las transacciones son compatibles (incluidas las transacciones simultáneas y la confirmación en dos fases).
La herramienta es muy modular. Admite tipos de datos y serialización conectables, almacenamiento conectable (a un archivo, a la memoria fuera de pila), implementaciones de mapas conectables (árbol B, árbol R, árbol B concurrente actualmente), almacenamiento BLOB y una abstracción del sistema de archivos para Soporta archivos cifrados y archivos zip.
H2
también está contenido en una sola biblioteca de 1.8 meg
También miré:
- http://www.mapdb.org/ (
13 meg
dependencias) - mapa de la crónica (dependencias de
5.5 meg
, distribuidas de forma rápida y opcional) - lmdbjava (
2 meg
dependencias de java + bibliotecalmdb
C) - la implementación más rápida pero nothread safe
fuera de la caja.
Parece que necesitas algo parecido a un db ligero. ¿Has mirado / considerado Java DB? Una base de datos ligera con una sola tabla indexada sería básicamente un mapa hash basado en disco y seguro para subprocesos.
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.
El proyecto Voldemort también es un "Hashmap" realmente rápido / escalable / de replicación. Se usa en LinkedIn y el rendimiento también es bastante bueno:
Una cita de su sitio:
Aquí está el rendimiento que vemos de un solo cliente de multiproceso que habla con un solo servidor donde el conjunto de datos "activo" está en la memoria bajo una carga artificialmente pesada en nuestro laboratorio de rendimiento:
Lecturas: 19,384 req / sec
Escribe: 16,559 req / sec
Chronicle Map implementa ConcurrentMap
y conserva los datos en el disco a través de la asignación de su memoria a un archivo.
Conceptualmente, Chronicle Map es muy similar a MapDB (proporciona una API de constructor y una interfaz de Map
similares), pero Chronicle Map es mucho más rápido que MapDB y tiene una concurrencia mucho mejor (Chronicle Map utiliza bloqueos de giro de niveles múltiples y altamente rayados).
MapDB
MapDB proporciona TreeMap y HashMap simultáneos respaldados por el almacenamiento en disco o fuera de la memoria de almacenamiento dinámico. Es un motor de base de datos Java integrado, rápido, escalable y fácil de usar. Está repleto de características como transacciones, serialización eficiente en espacio, caché de instancia y compresión / cifrado transparente. También tiene un rendimiento excepcional que rivaliza solo con los motores db integrados nativos.
jdbm2
Base de datos Java de valor clave incrustado.
Cualquiera de los archivos de propiedades o Berkeley DB puede ser lo que está buscando. El java.util.Properties
implementa java.util.Map
y proporciona métodos para load
y store
en un archivo. El DB de Berkeley a menudo se recomienda como un almacén de datos de par de valor-clave ligero.