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)
| 归档时间: |
|
| 查看次数: |
8125 次 |
| 最近记录: |