Berkeley DB: DB-> compact () всегда дает сбой для баз данных на основе хеша - PullRequest
1 голос
/ 02 марта 2011

Я решил использовать функцию сжатия Berkeley DB для оптимизации размера и частоты обращений к кешу моих баз данных после того, как некоторые записи были изменены (сокращены), оставляя «дыры» в базе данных.

Однако это не работает. Даже с этим очень простым сокращенным фрагментом кода:

if (db->open(db, NULL, dbFile, NULL, DB_HASH, DB_CREATE | DB_TRUNCATE, 0)) {
  // Error...
}

if (res = db->compact(db, NULL, NULL, NULL, NULL, DB_FREE_SPACE, NULL)) {
  db->err(db, res, "Compacting failed");
}

Я пытался указать пятый параметр или не указывать флаг, но все равно он завершается ошибкой с EINVAL (код 22) каждый раз:

Сжатие не удалось: неверный аргумент

(очень плохо, что нет точного сообщения об ошибке; у большинства ошибок БД Berkeley они есть)

Это работает, если я заменю DB_HASH на DB_BTREE, поэтому я считаю, что это как-то связано с использованием формата hash db. Однако, согласно документации , сжатие хеш-таблиц должно работать очень хорошо.

Кто-нибудь понял, что может вызвать эту ошибку?

PS: я использую Berkeley DB 4.5.20.

1 Ответ

2 голосов
/ 03 марта 2011

Я искал в журналах изменений последние несколько выпусков Berkeley DB.В журнале изменений для версии 5.0 говорится: «Добавлена ​​поддержка баз данных хэшей для интерфейса DB-> compact. [# 16936]».Хотя онлайн-документация для текущего выпуска гласит, что DB-> compact работает для баз данных Btree, Recno и Hash, в выпуск 5.0 была добавлена ​​поддержка Hash.Ваш вопрос на форуме Berkeley DB .

...