Обход базы данных BerkleyDB в порядке сохранения

#java #berkeley-db-je #database-cursor

#java #berkeley-db-je #база данных-курсор

Вопрос:

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

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

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

Ответ №1:

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

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

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

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

Комментарии:

1. С момента написания этого комментария Kyoto cabinet начал отправлять файл FOSSEXCEPTION с исходными кодами, который разрешает отправку «Продуктов Kyoto» с другим программным обеспечением OSS под лицензиями, несовместимыми с GPL. Это делает ее лицензирование менее строгим, чем у Berkeley DB JE. В настоящее время исключение поставляется только с основными исходными текстами C , но «Продукты Kyoto», по-видимому, подразумевают также различные языковые привязки.

Ответ №2:

Доступны новые интерфейсы «массового доступа», которые позволяют считывать несколько предположительно смежных записей в буфер, используя любой из методов 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() .

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

Комментарии:

1. Это потому, что мы говорим о немного разных реализациях базы данных. Вы имеете в виду BDB как привязку Java к BerkleyDB на основе C, а также средство, написанное на Java BerkleyDB JE. У них есть некоторые различия в API.

2. Вы уверены в этом? Мне кажется, что при (повторном) присвоении имени пакету просто удаляется квалификатор «Java Edition». Я работаю с библиотекой JE в течение нескольких лет, поэтому я понимаю, что вы ищете, но мне кажется, что документация, на которую я ссылался, представляет собой довольно свежий взгляд на эволюцию продукта JE.

3. Да, я почти уверен в этом. Кстати, предоставленная вами ссылка является частью документации библиотеки BerkleyDB, в которой отмечается, что Java API является всего лишь интерфейсом к родной библиотеке C: download.oracle.com/docs/cd/E17275_01/html/programmer_reference /… .

4. Цитата из документации: «Классы Java Berkeley DB в основном реализованы в собственных методах. Прежде чем вы сможете их использовать, вам необходимо убедиться, что DLL или общая библиотека, содержащие собственные методы, могут быть найдены вашей средой выполнения Java»

5. Спасибо за разъяснение. Учитывая это, можно было бы ожидать, что в JE должна быть эквивалентная возможность, но пока я не смог найти ничего подобного.