13
import lmdb
env = lmdb.open(path_to_lmdb)

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

4

3 回答 3

13

一种无需单独枚举键即可获取键总数的方法,同时计算所有子数据库:

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

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

  • 上述方法是瞬时的(0.0 s)
  • 迭代方法大约需要 1 秒。
于 2016-05-03T23:48:34.473 回答
7

您是否正在寻找类似的东西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在文档中搜索。

于 2015-09-09T22:03:30.400 回答
2

正如 Sait 指出的那样,您可以遍历光标以收集所有键。但是,这可能有点低效,因为它也会加载值。这可以通过在cursor.iternext()函数上使用 with来避免values=False

with env.begin() as txn:
  keys = list(txn.cursor().iternext(values=False))

我为具有 2^20 个条目的数据库在两种方法之间做了一个简短的基准测试,每个条目都有一个 16 B 键和 1024 B 值。

通过遍历光标(包括值)来检索键平均需要874 毫秒运行 7 次,而第二种方法只返回键需要517 毫秒。这些结果可能会因键和值的大小而异。

于 2021-01-11T08:58:51.863 回答