Поддерживает ли LMDB случайное чтение? - PullRequest
0 голосов
/ 18 июня 2020

Предположим, есть большой LMDB-файл. Обычно я получаю его содержимое последовательно, используя mdb_cursor_get (курсор, & key, & data, MDB_NEXT) через курсор.

А теперь, чтобы увеличить скорость чтения, я создаю очередь, разделив LMDB на 10 равных частей и запустив 10 потоков для чтения каждого фрагмента содержимого отдельно, а затем поместите то, что каждый поток читает, в очередь.

Это нормально? Меня не волнует порядок, только контент.

Если да, как мне синхронизировать курсор в каждом потоке?

1 Ответ

0 голосов
/ 23 июня 2020

В моих тестах многопоточность не улучшила эффективность чтения LMDB, но удвоила (или больше) время чтения.

Метод тестирования:

  1. Создайте LMDB с 10000 частями данных и запишите полное время чтения: 365 с

  2. Разделите LMDB этих 10000 частей данных на две равные части и четыре равные части и прочитайте одну равную часть независимо: читать только один 5000_LMDB время: 170 секунд читать только один 2500_LMDB время: 81 с

  3. Запуск нескольких потоков для чтения LMDB: два потока, общее время для чтения двух 5000_LMDB: 596x2 с Четыре потока , общее время чтения четырех 2500_LMDB: 301x4 с

...