Как избежать увеличения размера файла в базе данных Киото Кабинета с использованием базы данных хэш-файлов?
Я использую следующее, чтобы открыть:
db.open("db.kch#tune_defrag=10000", DB.OWRITER | DB.OCREATE)
Я ставлю и удаляю элементы. В конце выполнения база данных "пуста", функция count() возвращает 0, потому что я удаляю все элементы. Почему размер файла всегда увеличивается, когда я повторяю тест? Можно ли запустить что-то вроде "сборщика мусора" для очистки удаленных регистров? Если я выполню один и тот же тест 100 раз, у меня будет база данных размером 500 МБ, даже если у меня будет только 2 записи.
Я попытался поставить "tune_defrag=10000", но я думаю, что это не сработало.
Обс.: единственный регистр меньше 1К, я не понимаю, почему регистры занимают так много места на диске.
Спасибо за любую помощь
4 ответа
Попробуй это:
db.kch#dfunit=8
Это означает, что KC выполняет дефрагментацию для каждых 8 обнаруженных фрагментаций, и Mikio фактически рекомендует 8.
Доступные опции перечислены здесь, однако это может использовать некоторую полировку.
Бег:
kchashmgr defrag path_to_kcabinet_file
это то, что я делаю, чтобы получить размер файла DB. Я не нашел API-доступ к этому, поэтому я делаю это с помощью команды оболочки, используя утилиту kchashmgr (очевидно, это можно вызвать изнутри программы).
Я не использовал этот конкретный БД, но в некоторых других случаях решение этой проблемы заключается в том, чтобы скопировать БД в новый, а затем удалить старый. Убедившись, что он хорошо скопирован:).
Я внедрил этот процесс в производственные системы, поскольку он действительно очень хорошо закодирован и должен работать.
Из беглого просмотра документации по Киото не видно, что у вас есть какой-либо способ изменить размер или иным образом очистить базу данных от удаленных записей... или действительно управлять ею в любом виде или форме.
Похоже, что этот проект еще далек от того, чтобы быть "готовым к производству". Если вы действительно хотите его реализовать, я бы посоветовал связаться с владельцами проекта (http://fallabs.com/) и выяснить, есть ли у них планы относительно некоторых столь необходимых служебных функций.
В противном случае, я бы предложил перейти к другой базе данных в стиле nosql, которая немного более зрелая.