【问题标题】:How do I count and enumerate the keys in an lmdb with python?如何使用 python 计算和枚举 lmdb 中的键?
【发布时间】:2015-12-06 00:37:56
【问题描述】:
import lmdb
env = lmdb.open(path_to_lmdb)

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

【问题讨论】:

  • 我发现那里多了一个括号。

标签: python lmdb


【解决方案1】:

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

【讨论】:

  • 没有。我知道文档页面。我想知道如何在不单独枚举它们的情况下获取键的总数。我还想知道枚举所有键值对的最佳(最快)方法。您提到的方法对我来说似乎需要很长时间,但这可能与我的数据库大小(大约 1m 条目)有关。
  • @Doug 我通过迭代光标更新了我的答案以获取键列表。不过可能有更快的方法。
  • 除了遍历键需要很长时间之外,读取键列表还有其他缺点吗?
【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-14
      • 1970-01-01
      • 2019-12-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多