Python DBM真的很快吗?

Goo*_*bot 4 python database dbm nosql

我认为Python的原生DBM应该比NOSQL数据库(例如Tokyo Cabinet,MongoDB等)快得多(因为Python DBM具有较少的功能和选项;即更简单的系统).我用一个非常简单的写/读示例进行了测试

#!/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
Run Code Online (Sandbox Code Playgroud)

读/写:1.3s读:0.3s写:1.0s

MongoDb的这些值至少快5倍.它真的是Python DBM性能吗?

Leo*_*ski 15

Python没有内置的DBM实现.它的DBM功能基于各种DBM风格的第三方库,如AnyDBM,Berkeley DBM和GNU DBM.

Python的字典实现对于键值存储来说非常快,但不是持久性的.如果您需要高性能的运行时键值查找,您可能会更好地找到字典 - 您可以使用cpickle或shelve之类的东西来管理持久性.如果启动时间对您很重要(如果您正在修改数据,终止) - 比运行时访问速度更重要 - 那么像DBM这样的东西会更好.

在您的评估中,作为主循环的一部分,您既包括dbm open调用,也包括数组查找.在查找之前打开DBM来存储一个值并关闭并重新打开是一个非常不切实际的用例,并且您看到了以这种方式管理持久性数据存储时的典型缓慢性能(它是非常低效).

根据您的要求,如果您需要快速查找并且不太关心启动时间,DBM可能是一个解决方案 - 但要对其进行基准测试,只需在循环中包含写入和读取!像下面这样的东西可能是合适的:

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()
Run Code Online (Sandbox Code Playgroud)

  • 是的,如果你只有关键:值对,它可能是适合你情况的最简单的解决方案.您可能希望对各种DBM进行基准测试,以确定哪些工作正常; AnyDBM被描述为最便携的Python DBM,它使它适用于示例和学习,但它可能不是最适合您的. (3认同)
  • +1这样的信息和描述性答案. (2认同)
  • 它会很慢,毫无疑问 - 虽然cPickle通常比Pickle快得多.cPickle与大多数Python软件包捆绑在一起,几乎与Pickle 100%兼容; 您可以在代码中用'cpickle'替换'pickle'.对于一个关键:该大小的值数据结构,dbm实现甚至sqlite可能会有较低的启动时间. (2认同)