Pregunta

Necesito una clave rápida, fiable y eficaz memoria - base de datos de valor para Linux. Mis llaves están a unos 128 bytes, y el tamaño máximo valor puede ser 128K o 256K. El subsistema de base de datos no debe utilizar más de aproximadamente 1 MB de memoria RAM. El tamaño total de base de datos es de 20G (!), Pero se accede sólo una pequeña fracción aleatoria de los datos a la vez. Si es necesario, puedo mover algunas gotas de datos de la base de datos (para los archivos normales), por lo que el tamaño se reduce a 2 GB como máximo. La base de datos debe sobrevivir a un fallo del sistema sin pérdida de los datos recientemente modificados. Voy a tener alrededor de 100 veces más lecturas que escrituras. Es una ventaja si se puede utilizar un dispositivo de bloque (sin un sistema de archivos) como almacenamiento. No necesito la funcionalidad de cliente-servidor, sólo una biblioteca. Necesito enlaces Python (pero puedo ponerlas en práctica si no están disponibles).

¿Qué debo tener en cuenta las soluciones, y cuál se recomienda?

Los candidatos que conozco que podría funcionar:

  • Tokio gabinete (enlaces Python son pytc , consulta pytc código de ejemplo , es compatible con los hashes y B + árboles, archivos de registro de transacciones y mucho más, el tamaño de la matriz de cubo está fijado en el tiempo de creación de bases de datos; el escritor debe cerrar el archivo para dar a otros la oportunidad; un montón de pequeñas escribe con reabrir el archivo para cada uno de ellos son muy lentos; el servidor tirano puede ayudar con las porciones de las escrituras pequeñas; Comparación de velocidad entre Tokio Gabinete, Tokio Tirano y Berkeley DB )
  • VSDB (seguro incluso en NFS, sin bloquear, ¿qué pasa con las barreras ?; actualizaciones son muy lento, pero no tan lento como en el CDB; versión última en 2003)
  • BerkeleyDB (proporciona la recuperación de bloqueo; proporciona transacciones; el módulo bsddb Python proporciona enlaces)
  • TDB de Samba (con las transacciones y los enlaces Python, algunos usuarios experimentado la corrupción , a veces mmap()s todo el archivo, la operación repack veces duplica el tamaño del archivo, produce misteriosos fallos Si la base de datos es mayor que 2G (incluso en sistemas de 64 bits), sistema de agrupación ( CTDB ) también disponible ; archivo crece demasiado grande después de un montón de modificaciones; archivo se vuelve demasiado lento después de un montón de contención de hash; hay manera integrada para reconstruir el archivo; cambios muy rápidos en paralelo mediante el bloqueo de los cubos de clave individual)
  • aodbm (solo-agregar por lo que sobrevive a una caída del sistema, con enlaces de Python)
  • Hamsterdb (con enlaces Python)
  • C-árbol (solución comercial madura, versátil, con alto rendimiento, tiene una edición gratuita con funcionalidad reducida)
  • TDB (de 2001)
  • bitcask (log-estructurada, escrito en Erlang)
  • varias otras implementaciones de DBM (como GDBM, NDBM, qdbm ,, SDBM de Perl o Ruby, probablemente no tienen la recuperación de bloqueo adecuado)

No utilizaré los siguientes:

  • MemcacheDB (cliente-servidor, utiliza BereleleyDB como backend)
  • CDB (necesita para regenerar toda la base de datos sobre cada uno de escritura)
  • http://www.wildsparx.com/apbcdb/ (ídem)
  • Redis (que guarda toda la base de datos en la memoria)
  • SQLite (se hace muy lento sin pasar la aspiradora periódico, ver la terminación automática en el en la barra de direcciones en Firefox 3.0, a pesar de que las versiones 3.1 y posteriores de sqlite permitir auto_vacuuming; cuidado: las transacciones de escritura pequeños pueden ser muy lenta; cuidado: si un proceso de ocupados está haciendo muchas de las transacciones, otros procesos de morir de hambre, y nunca pueden conseguir la cerradura)
  • MongoDB (demasiado pesado-peso, trata los valores como objetos con estructura interna)
  • Firebird (RDBMS basado en SQL, también de alto gramaje )

Para su información, una reciente artículo sobre la tecla - bases de datos de valor en la revista Linux.

Para su información, una software antiguo lista

Para su información, una comparación velocidad de MemcacheDB, Redis y Tokio Gabinete tirano

preguntas relacionadas sobre StackOverflow:

¿Fue útil?

Solución

He tenido buena suerte con la solución / pytc Tokio Gabinete. Es muy rápido (un poco más rápido que usar el módulo de estantería utilizando anydbm en mi aplicación), tanto para la lectura y la escritura (aunque también lo hacen mucho más lectura). El problema para mí era la documentación espartano en los enlaces de Python, pero no es suficiente código de ejemplo en torno a la manera de hacer lo que tiene que hacer. Además, el gabinete de Tokio es muy fácil de instalar (al igual que los enlaces Python), no requiere un servidor (como usted menciona) y parece estar apoyado activamente (estable, pero ya no está bajo desarrollo activo) . Puede abrir archivos en modo de sólo lectura, lo que permite el acceso concurrente, o leer modo lectura / escritura, evitando que otros procesos de acceso a la base de datos.

Yo estaba mirando varias opciones durante el verano, y el consejo que me dieron entonces era la siguiente: probar las diferentes opciones y ver lo que funciona mejor para usted. Sería bueno si hubiera simplemente una opción "mejor", pero cada uno está buscando características ligeramente diferentes y están dispuestos a hacer diferentes ventajas y desventajas. Usted sabe mejor.

(Dicho esto, sería útil a los demás, si usted comparte lo que terminó trabajando lo mejor para ti, y por qué eligió esa solución sobre los demás!)

Otros consejos

LMDB es la base de datos más eficaz memoria en torno http://symas.com/mdb/inmem/

y también demostrado ser el más confiable - completamente a prueba de errores. http://wisdom.cs.wisc.edu/workshops/spring -14 / charlas / Thanu.pdf

De los que usted ha mencionado, Tokio Consejo de Ministros ha documentado problemas de corrupción https://www.google.com/search?q=cfengine+tokyo + gabinete + corrupción

BerkeleyDB también ha documentado bien los problemas de corrupción, como lo hace Bitcask. (Y es una bitcask en memoria de sólo DB de todos modos, tan inútil para su requerimiento de 1 MB de RAM.)

LMDB también está bien soportado en Python, con un par de ediciones diferentes disponibles. https://github.com/dw/py-lmdb/ https://github.com/tspurway/pymdb-lightning

Renuncia - Soy el autor de LMDB. Pero estos son hechos documentados:. LMDB es el almacén de claves / valor más pequeño, más eficiente y más confiable en el mundo y nada más viene en cualquier lugar cerca

BDC puede manejar cualquier base de datos de hasta 4 GB, por lo que es demasiado pequeño para el asunto que nos ocupa 20 GB.

Riak se ejecuta en Linux, y permite agregar dinámicamente nodos

¿qué tal dbm.ndbm de Python 3.0?

Otra sugerencia es TDB (una parte del proyecto Samba). Lo he utilizado a través de la tdb módulo, sin embargo no puedo decir que me' ve probado su fiabilidad en accidentes; los proyectos que he utilizado en no contaban con tales requisitos, y no puedo encontrar documentación pertinente.

¿qué tal un SQLite?

He usado bsddb.hashlib () con Python, funcionó bastante bien.

Es posible que como djb 's BDC , que tiene las propiedades que usted menciona.

mi consulta para un multiplataforma base de datos estilo ISAM (similar), también recibí sugerencias para la versión incorporada de Firebird y GLib .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top