python bsddb не очищается при удалении записей - PullRequest
1 голос
/ 31 августа 2011

Я получил базу данных Python BSDDB.Очевидно, он хранится на жестком диске.Когда я удаляю некоторые записи, файл на диске не становится меньше (следовательно, он растет довольно быстро ...)

utDelList   = []
urlsDelList = []
for ut in iter(self.urls2task):

    tmp = string.split(ut, ":")
    uid = tmp[1]
    url = cPickle.loads(self.urls[int(uid)])
    urlsDelList.append(uid)             
    utDelList.append(ut)                
    del self.urlsDepth[uid]
    del self.urlsStatus[uid]
    del url

for ut in utDelList:
    del self.urls2task[ut]

for uid in urlsDelList:
    del self.urls[int(uid)]

(...)
#synchronize all files
self.sync() 

Моя последняя надежда заключалась в том, чтобы принудительно выполнить сброс -закрытие и открытие файлов снова

#close all files & start them again, eg
self.tasks.close()
self.urls2task.close()
self.tasks = bsddb.rnopen(filepath)
self.urls2task = bsddb.hashopen

критический элемент здесь - запись self.tasks;растет самый быстрый и самый большой из всех файлов.Изменит ли консервирование каким-либо образом способ его удаления?И еще раз - почему файлы все еще сохраняют записи после их удаления?Буду признателен за 4 предложения (первое сообщение здесь:))

Ответы [ 3 ]

1 голос
/ 31 августа 2011

Вы пытались использовать метод db.compact () ?

Согласно документации:

compact (start = None), stop = None, flags = 0, compact_fillpercent = 0, compact_pages = 0, compact_timeout = 0)

Сжатие баз данных методов доступа Btree и Recno и при необходимости возвращает неиспользованные страницы баз данных Btree, Hash или Recno вбазовая файловая система.

Метод возвращает количество страниц, возвращаемых в файловую систему.

Похоже, это должно уменьшить размер базы данных на диске

0 голосов
/ 31 августа 2011

Вы должны сжать свою базу, как описано в http://www.jcea.es/programacion/pybsddb_doc/db.html#db-methods

0 голосов
/ 31 августа 2011

Вероятно, нет никакого способа получить место обратно из базы данных btree.Лучшее, что вы можете сделать - это db_dump всех данных в текстовом файле и создать новый db с db_load этого файла.

...