如何使用Python计数和枚举LMDB中的键?

14
import lmdb
env = lmdb.open(path_to_lmdb)

现在我似乎需要创建一个事务和一个游标,但是我该如何获取可以迭代的键列表?


2
我看到那里多了一个括号。 - Sait
3个回答

16

一种获取所有键的总数,而无需逐个枚举它们,也要计算所有子数据库的方法:

with env.begin() as txn:
    length = txn.stat()['entries']

在我的笔记本电脑上使用手工制作的1000000大小数据库进行测试结果:

  • 以上方法瞬间完成(0.0秒)
  • 迭代方法需要大约1秒钟。

8
你是否正在寻找类似this这样的东西:
with env.begin() as txn:
    with txn.cursor() as curs:
        # do stuff
        print 'key is:', curs.get('key')

更新:

这可能不是最快的方法:

with env.begin() as txn:
   myList = [ key for key, _ in txn.cursor() ]
   print(myList)

免责声明:我对这个库一无所知,只是在它的文档中搜索了关键词key


不,我知道文档页面。我想知道如何在不逐个枚举它们的情况下获取键的总数。我还想知道枚举所有键值对的最佳(最快)方法。你提到的方法对我来说似乎需要相当长的时间,但这可能与我的数据库大小有关(约1百万条目)。 - Doug
@Doug 我更新了我的答案,通过迭代游标来获取键列表。不过可能有更快的方法。 - Sait
除了需要花费很长时间来迭代键之外,读取键列表还有其他缺点吗? - Rakshit Kothari

4
正如Sait所指出的那样,您可以迭代游标以收集所有键。但是,这可能有点低效,因为它还会加载值。您可以通过使用 cursor.iternext() 函数并设置参数values=False 来避免这种情况。
with env.begin() as txn:
  keys = list(txn.cursor().iternext(values=False))

我对拥有2^20条记录,每个记录都有16 B的关键字和1024 B的值的数据库进行了简短的基准测试。

通过游标迭代(包括值)检索关键字平均需要874毫秒,在7次运行中,而第二种方法仅返回关键字平均需要517毫秒。这些结果可能会因关键字和值的大小而异。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接