Обход базы данных BerkleyDB в порядке магазина - PullRequest
1 голос
/ 10 мая 2011

При использовании курсоров в BerkleyDB JE я обнаружил, что обход набора данных генерирует много случайных операций чтения / вывода. Это происходит потому, что набор данных перемещения BDB в порядке возрастания первичного ключа.

В моем приложении у меня нет никаких требований для обработки набора данных по порядку (говоря математически, моя операция коммутативна), и я заинтересован в максимизации пропускной способности.

Есть ли способ обработки набора данных с курсором в порядке хранения, а не в порядке первичного ключа.

Ответы [ 2 ]

2 голосов
/ 10 мая 2011

Я бы не догадался; BDBJE - это база данных с лог-структурой, т. Е. Все записи добавляются в конец журнала. Это означает, что записи всегда добавляются к последнему журналу и могут заменять записи в предыдущих журналах. Поскольку BDBJE по своей конструкции не может записывать в старые журналы, он не может пометить старые записи как замененные, поэтому вы не можете идти вперед по записям обработки хранения, потому что не знаете, является ли запись текущей, не обработав записи позже в журнале.

BDBJE будет очищать старые журналы, так как их количество "живых" записей уменьшается, копируя текущие записи в новые журналы и удаляя старые файлы, что еще больше упрощает порядок.

Я обнаружил, что Java-привязка Kyoto Cabinet быстрее, чем BDB, для необработанной производительности вставки, и у вас есть выбор форматов хранения, которые могут позволить вам оптимизировать производительность обхода записей, упорядоченных курсором. Лицензия аналогична (Киотский кабинет GPL3, BDB - лицензия Oracle BDB (copyleft)), если вы не платите за коммерческую лицензию в любом случае.

Обновление: Начиная с версии 5.0.34 , BDBJE включает в себя класс DiskOrderedCursor, который обращается к необходимому сценарию использования - он просматривает записи в последовательности журнала, которая в нефрагментированном файле журнала должна соответствовать порядку диска .

0 голосов
/ 11 мая 2011

Доступны новые интерфейсы «массового доступа», которые позволяют считывать несколько предположительно смежных записей в буфер, используя любой из методов Db#get() или Dbc#get()вместе с флагом DB_MULTIPLE .

Эта документация предназначена для версии 4.2.52, и у меня возникли некоторые проблемы с поиском документации для пакета com.sleepycat.db на сайте Oracle. Здесь я нашел документацию для версии 4.8.30 , но классы Db и Dbc там не упоминаются.

Ах, классы MultipleEntryи MultipleDataEntry выглядят многообещающими эквивалентами использованию DB_MULTIPLE выше.Идея состоит в том, что когда вы извлекаете данные, используя, скажем, MultipleDataEntry с буфером подходящего размера, вы получаете целую кучу записей, которые затем можно выделить, используя MultipleDataEntry#next().

У меня сложилось впечатление, что эта часть интерфейса постоянно менялась.Поскольку у меня нет достаточно свежей версии библиотеки, доступной в моем проекте, я не могу утверждать, что использовал эти интерфейсы массового извлечения еще.Пожалуйста, сообщите, если вы можете расследовать их использование.

...