如何使用 python 计算和枚举 lmdb 中的键?

How do I count and enumerate the keys in an lmdb with python?

import lmdb
env = lmdb.open(path_to_lmdb)

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

您是否在寻找类似 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

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

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

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

  • 上面的方法是瞬时的(0.0秒)
  • 迭代方法大约需要1秒。

正如 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 毫秒。这些结果可能因键和值的大小而异。