Berkeley DB Bulk Feature - PullRequest
       5

Berkeley DB Bulk Feature

0 голосов
/ 07 марта 2011

Привет Я нигде не могу найти информацию о функции массовой вставки Berkeley DB, написанной на C . Я могу найти информацию об обновлении, выборе и удалении в http://download.oracle.com/docs/cd/E17076_02/html/programmer_reference/am_misc_bulk.html. Кто-нибудь может сказать мне, как написать эту функцию массовой вставки? Я новичок как в C, так и в Berkeley DB.

  • Я также хочу написать довольно много данных (может быть 30 ГБ), используя эту функцию, поэтому, пожалуйста, посоветуйте мне и производительность.
  • мой босс хочет, чтобы я использовал метод доступа Hash.

Спасибо

Кевин

Ответы [ 5 ]

3 голосов
/ 08 марта 2011

Я не знаю, поможет ли это или навредит, учитывая вашу новизну как в C, так и в BerkleyDB.

Вам необходимо использовать флаг DB_MULTIPLE с DB->put().

Для этого вам необходимо создать массив DBT для ваших ключей и один для ваших данных.Буферы должны быть достаточно большими, чтобы вместить весь набор ключей и значений соответственно.Затем вам нужно инициализировать их оба с помощью DB_MULTIPLE_WRITE_INIT, а затем добавить свои ключи и значения в соответствующий буфер с помощью DB_MULTIPLE_WRITE_NEXT.

Это было добавлено в 4.8 и, честно говоря, я не могу найти конкретный пример для вас через Google.

РЕДАКТИРОВАТЬ: По крайней мере, в последних версиях есть пример кода, предоставляемый BerkeleyDB для массовых операций.Вам нужно взглянуть на examples/c/ex_bulk.c

1 голос
/ 20 апреля 2016

Массовая загрузка хеша в DB Беркли была проблемой в прошлом. Следующая статья исследует это далее и предлагает алгоритм, чтобы ускорить это. Предложенный алгоритм сортирует данные так, как ожидает линейный хеш (в Berkeley DB), следовательно, загрузку можно выполнить за одно сканирование отсортированных данных. Это очень хорошо масштабируется для больших наборов данных. Davood Rafiei, Cheng Hu, Массовая загрузка линейного хеш-файла, Proc. конференции DaWak, 2006. https://webdocs.cs.ualberta.ca/~drafiei/papers/dawak06.pdf

1 голос
/ 21 марта 2011

Ради пользователей C ++, вот как это сделать, используя API Berkeley C ++, который не документирован и имеет ноль примеров. Это работает довольно хорошо, хотя!

Создайте Dbt (база данных Thang, я не придумываю это) для хранения буфера памяти:

void * buf = new unsigned char [bufferSize]; dbt = новый Dbt; dbt-> set_data (BUF); dbt-> set_ulen (BufferSize); dbt-> set_flags (DB_DBT_USERMEM);

Свяжите это с DBMultipleKeyDataBuilder:

DBMultipleKeyDataBuilder * dbi = новый DBMultipleKeyDataBuilder (дБт);

Добавляйте пары «ключ» и «значение» по одной до тех пор, пока не завершите или буфер не заполнится

DBI-> Append (curKeyBuf, curKeyLen, curDataBuf, curDataLen); ... (их гораздо больше) ...

ИСПОЛЬЗУЙТЕ свою БД * db, и транзакцию, если хотите в txn, и массовую запись: db-> put (txn, dbt, NULL, DB_MULTIPLE_KEY);

удалить dbi;

Я упустил много деталей, таких как проверка того, что буфер заполнен или достаточно большой, чтобы вместить хотя бы одну пару KV.

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

1 голос
/ 08 марта 2011

Форумы Berkeley DB контролируются несколькими разработчиками Berkeley DB. Это было бы еще одним хорошим местом для размещения таких вопросов.

1 голос
/ 07 марта 2011

Вы можете попробовать выполнить одну или несколько фиксаций / транзакций. Например: начать транзакцию, сделать вставки, завершить транзакцию. Это нормальный способ ускорить изменения в базе данных, поскольку он снижает накладные расходы на транзакции независимых операторов SQL.

Я не знаком с API Berkely DB, так что он может иметь что-то лучше для массовых операций, просто предлагая советы.

Edit:
Некоторые ссылки относительно транзакций:
1. Запись в Википедии
2. Пропускная способность транзакций в Berkley DB

...