shelve выдает KeyError и «не может добавить элемент в базу данных» - PullRequest
0 голосов
/ 19 января 2019

Мой следующий код:

shelve_object = shelve.open('data/shelve_data', writeback=True)
print([key for key in shelve_object])
for key in shelve_object:
    print(shelve_object[key])

дает мне следующий вывод:

['251784238314029058', '259650808973492225', '493076669914152965', '525293044375879690', '272814395237859330']

Traceback (most recent call last):
  File "/usr/lib/python3.6/shelve.py", line 111, in __getitem__
    value = self.cache[key]
KeyError: '251784238314029058'

Я также заметил следующие ошибки в моих журналах:

  File "/usr/lib/python3.6/shelve.py", line 113, in __getitem__
    f = BytesIO(self.dict[key.encode(self.keyencoding)])
_dbm.error
  File "/usr/lib/python3.6/shelve.py", line 125, in __setitem__
    self.dict[key.encode(self.keyencoding)] = f.getvalue()
_dbm.error: cannot add item to database

Как это возможно, что полка возвращает ключи, которые, кажется, не существуют?

1 Ответ

0 голосов
/ 19 января 2019

Либо файл dbm, поддерживающий вашу полку, поврежден, либо у вас есть какая-то несовместимость между вашим файлом и внутренней библиотекой dbm, используемой для вашего файла полки.

shelve поддерживается модулем dbm , и именно от вашей ОС зависит, какая именно реализация используется, но, вообще говоря, файл dbm находится на диске хеш-таблица , структура данных, которая использует структуру разреженных таблиц для более эффективного нахождения ключей позже.

Чтобы показать вам все ключи в файле, библиотека dbm просканирует таблицу и выдаст вам каждый ключ, когда обнаружит непустую ячейку. Но чтобы найти значение для данного ключа, ему нужно было бы хэш ключ, чтобы найти число от нуля до максимального размера таблицы, посмотреть на соответствующую строку в таблице и получить значение.

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

...