python nosql database dbm

¿Python DBM es realmente rápido?



nosql database (1)

Estaba pensando que el DBM nativo de Python debería ser bastante más rápido que las bases de datos NOSQL, como Tokyo Cabinet, MongoDB, etc. (ya que Python DBM tiene características y opciones menores, es decir, un sistema más simple). Probé con un ejemplo de escritura / lectura muy simple como

#!/usr/bin/python import time t = time.time() import anydbm count = 0 while (count < 1000): db = anydbm.open("dbm2", "c") db["1"] = "something" db.close() db = anydbm.open("dbm", "r") print "dict[''Name'']: ", db[''1'']; print "%.3f" % (time.time()-t) db.close() count = count + 1

Lectura / Escritura: 1.3s Lectura: 0.3s Escritura: 1.0s

Estos valores para MongoDb son al menos 5 veces más rápidos. ¿Es realmente el rendimiento de Python DBM?


Python no tiene una implementación de DBM incorporada. Basa sus funciones de DBM en una amplia gama de bibliotecas de terceros de estilo DBM, como AnyDBM, Berkeley DBM y GNU DBM.

La implementación del diccionario de Python es realmente rápida para el almacenamiento de clave-valor, pero no es persistente. Si necesita búsquedas de valor-clave de tiempo de ejecución de alto rendimiento, puede encontrar un diccionario mejor; puede administrar la persistencia con algo como cpickle o shelve. Si los tiempos de inicio son importantes para usted (y si está modificando los datos, la terminación), más importantes que la velocidad de acceso en tiempo de ejecución, entonces algo como DBM sería mejor.

En su evaluación, como parte del bucle principal, ha incluido tanto llamadas abiertas de DBM como también búsqueda en matriz. Es un caso de uso bastante poco realista abrir un DBM para almacenar un valor, cerrarlo y volver a abrirlo antes de buscarlo, y está viendo el rendimiento lento típico que uno tendría al administrar un data store persistente de esa manera (es bastante ineficiente).

Dependiendo de sus requisitos, si necesita búsquedas rápidas y no le preocupan demasiado los tiempos de inicio, DBM podría ser una solución, pero para compararlo, ¡solo incluya escrituras y lecturas en el ciclo! Algo como el siguiente podría ser adecuado:

import anydbm from random import random import time # open DBM outside of the timed loops db = anydbm.open("dbm2", "c") max_records = 100000 # only time read and write operations t = time.time() # create some records for i in range(max_records): db[str(i)] = ''x'' # do a some random reads for i in range(max_records): x = db[str(int(random() * max_records))] time_taken = time.time() - t print "Took %0.3f seconds, %0.5f microseconds / record" % (time_taken, (time_taken * 1000000) / max_records) db.close()