Berkeley DB Java Edition - настройка для большого объема данных - PullRequest
3 голосов
/ 19 июля 2010

Мне нужно загрузить более 1 миллиарда ключей в Berkley DB, и поэтому я хочу настроить его заранее, чтобы повысить производительность. В стандартной конфигурации мне требуется около 15 минут, чтобы загрузить 1000 000 ключей, что слишком медленно. Есть ли правильный способ настройки, например, B + Tree Berkley DB (размер узла и т. Д.)?

(Для сравнения: после настройки токийского кабинета он загружает 1 миллиард ключей за 25 минут).

P.S. Я ищу советы по настройке в виде кода, а не параметры, которые нужно установить для работающей системы (например, размер jvm и т. Д.) *

Ответы [ 2 ]

6 голосов
/ 30 октября 2010

Мне любопытно, когда TokyoCabinet загружает ключи 1B за 25 минут, каковы размеры хранимых ключей / значений? Какие системы ввода-вывода и системы хранения вы используете? Используете ли вы термин «нагрузка» для обозначения транзакционных транзакций 1B в постоянное стабильное хранилище? Это будет ~ 666 666 вставок в секунду, что физически невозможно, учитывая любую систему ввода-вывода, о которой я знаю. Умножьте это число на величину ключа и значения, и теперь вы безнадежно выйдете за физические пределы.

Пожалуйста, взгляните на блог Gustavo Duarte , прочитайте немного о системах ввода-вывода и о том, как работают аппаратные средства, а затем просмотрите ваше утверждение. Мне очень интересно узнать, что именно TokyoCabinet делает, а что нет. Если бы мне пришлось угадывать, я бы сказал, что он либо фиксирует кэш файловой системы в операционной системе, но не сбрасывает (fdsync () -) эти буферы на диск.

Полное раскрытие информации: я являюсь менеджером по продукту в Oracle для Oracle Berkeley DB (прямой конкурент TokyoCabinet), я играю с этими базами данных и с лучшим оборудованием для них около десяти лет, поэтому я оба предвзятый и скептический.

В Berkeley DB есть флаги, которые вы можете установить в дескрипторе транзакции, которые имитируют этот и другие подобные методы замены долговечности ("D" в ACID) для скорости.

Что касается того, как сделать Berkeley DB Java Edition (BDB-JE) быстрее, вы можете попробовать следующее:

  • Отложенные записи: это задерживает запись в журнал транзакций до тех пор, пока возможно (когда буферы заполнены, это сбрасывает данные)
  • Сортируйте ключи заранее: большинство B-Trees (включая наших) делают много лучше с порядком вставок для быстрое время загрузки-
  • Увеличение размера бревна файлы по умолчанию от 10 МБ до что-то большее, как 100MiB, это снижает стоимость ввода-вывода -

Очень важно иметь четкое представление о требованиях к производительности с базами данных. Они кажутся простыми, но, оказывается, очень сложно сделать их правильно, чтобы они никогда не повредили данные и не потеряли совершенные транзакции.

Надеюсь, это вам немного поможет.

0 голосов
/ 17 сентября 2014

Массовая вставка в BDB-JE происходит на порядок быстрее, если вы группируете их в одну транзакцию.Причина заключается в том, что каждый отдельный коммит вызывает (по умолчанию) синхронизированную запись на диск, в то время как транзакция синхронизируется при коммите.В моем приложении написание 100'000 маленьких ключей в виде одиночных коммитов занимает больше минуты, а в транзакции это занимает всего несколько секунд.

...