Как подсчитать и перечислить ключи в lmdb с помощью python?

import lmdb
env = lmdb.open(path_to_lmdb)

Теперь мне кажется нужно создать транзакцию и курсор, но как мне получить список ключей, которые я могу перебирать?


person Doug    schedule 09.09.2015    source источник
comment
Я заметил там лишнюю скобку.   -  person Sait    schedule 10.09.2015


Ответы (3)


Способ получить общее количество ключей без их перечисления по отдельности, включая все подбазы данных:

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

Результат теста с самодельной базой данных размером 1000000 на моем ноутбуке:

  • вышеописанный метод является мгновенным (0,0 с)
  • метод итерации занимает около 1 секунды.
person sytrus    schedule 03.05.2016

Вы ищете что-то вроде 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 в документах.

person Sait    schedule 09.09.2015
comment
Нет. Я знаю о странице документации. Я хочу знать, как получить общее количество ключей, не перечисляя их по отдельности. Я также хотел бы знать лучший (самый быстрый) способ перечисления всех пар значений ключа. Упомянутый вами метод, похоже, занимает у меня довольно много времени, но он может иметь какое-то отношение к размеру моей базы данных (около 1 млн записей). - person Doug; 10.09.2015
comment
@Doug Я обновил свой ответ, чтобы получить список ключей, повторяя курсор. Хотя может есть более быстрый способ. - person Sait; 10.09.2015
comment
Помимо того факта, что перебор ключей займет много времени, есть ли другие недостатки чтения списка ключей? - person Rakshit Kothari; 12.09.2020

Как указал Саит, вы можете перебирать курсор, чтобы собрать все ключи. Однако это может быть немного неэффективно, так как это также загрузит значения. Этого можно избежать, используя функцию cursor.iternext() с values=False.

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

Я провел небольшой тест между обоими методами для БД с 2**20 записями, каждая с ключом 16 байт и значением 1024 байт.

Извлечение ключей путем перебора курсора (включая значения) заняло в среднем 874 мс для 7 запусков, в то время как второй метод, при котором возвращаются только ключи, занял 517 мс. Эти результаты могут отличаться в зависимости от среднего размера ключей и значений.

person critop    schedule 11.01.2021