Ошибка дубликата ключа в Berkeley DB - PullRequest
0 голосов
/ 10 октября 2011

Я пытался запустить Беркли БД и запустить проект C #, который у меня есть. Я скачал и собрал версию .NET из Oracle. По большей части, это работает так, как я ожидал, и выступаю как чемпион. Но одна проблема, с которой у меня проблемы, связана с дублированием ключей.

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

db.PutNoDuplicate(k, v);

Вывод на консоли говорит «Недопустимый флаг, указанный в DB-> put», и возникает исключение с кодом ошибки 22. Само исключение не содержит информации.

Итак, я подумала, хорошо, может быть, этот метод содержит ошибки, я просто проверю сам. Я изменил код на

if (db.Exists(k))
    throw new System.Data.DataException("Duplicate key");
else
    db.Put(k, v);

Это работает, но крайне медленно. Для справки, он добавляет примерно 10 000 записей почти мгновенно, когда вызывается только db.Put, но замедляется примерно до 40 записей в секунду при выполнении вышеупомянутой проверки db.Exists. Это просто не может быть правдой.

Может кто-нибудь предложить какое-либо понимание того, что происходит? Спасибо!

РЕДАКТИРОВАТЬ: Итак, я выяснил часть этого. Замедление проверки db.Exists () происходило из-за того, что код Berkeley-DB регулярно генерирует и обрабатывает внутреннее исключение, когда функция возвращает false. Когда я запускаю сборку релиза кода, скорость возвращается туда, где я и ожидал. Но я все еще хотел бы знать, почему вызов putNoDuplicate терпит неудачу во-первых.

...