LevelDB для сотен миллионов записей - PullRequest
0 голосов
/ 01 марта 2019

Какие основные факторы следует учитывать при настройке вставок для хранилища LevelDB?

Я вставляю 500M + записей в виде:

  1. key = "rs1234576543" очень предсказуемая структура.rs <1+ цифр>
  2. value = "1 20000, A, C" строка может быть намного длиннее, но обычно ~ 40 символов
  3. ключиуникальный
  4. порядок вставки ключей является случайным

в хранилище LevelDB с использованием уровня python, и наблюдается резкое падение скорости по мере роста количества записей.Я предполагаю, что это ожидаемо, но есть ли меры настройки, на которые я мог бы обратить внимание, чтобы сделать его лучше масштабируемым?

Пример кода:

import plyvel
BATCHSIZE = 1000000

db = plyvel.DB('/tmp/lvldbSNP151/', create_if_missing=True)
wb = db.write_batch()
# items not in any key order
for key, value in DBSNPfile:
    wb.put(key,value)
    if i%BATCHSIZE==0:
        wb.write()
wb.write()

Я пробовал пакеты разных размеров, что помогает немного,но я надеюсь, что есть кое-что еще, что я пропустил.Например, можно ли использовать максимальную длину ключа (или значения)?

1 Ответ

0 голосов
/ 31 марта 2019

(Автор Plyvel здесь.)

LevelDB сохраняет все элементы базы данных в отсортированном порядке.Поскольку вы пишете в случайном порядке, это в основном означает, что все части базы данных перезаписываются все время, так как LevelDB должен объединять SST (это происходит в фоновом режиме).Как только ваша база данных увеличивается, и вы продолжаете добавлять к ней больше элементов, это приводит к снижению пропускной способности записи.

Я подозреваю, что производительность не будет ухудшаться так же плохо, если у вас будет лучшая локальность ваших записей.

Другие идеи, которые стоит попробовать:

  • увеличить write_buffer_size
  • увеличить max_file_size
  • эксперимент с большим block_size
  • use .write_batch(sync=False)

Все вышеперечисленное можно использовать из Python, используя дополнительные аргументы ключевого слова для plyvel.DB и для метода .write_batch().Подробнее см. api docs .

...