Как я могу восстановить данные из возможно поврежденной или слишком большой базы данных Python Shelve?

Я использовал Shelve в качестве хранилища документов. Ключ представляет собой строковое целое число, а значение представляет собой просто какой-то html в строке. К сожалению, мой сценарий закончил тем, что поместил так много записей в базу данных, что возникли ошибки (у меня нет точных под рукой). БД имеет размер около 36 ГБ, и теперь, когда я загружаю ее, а затем пытаюсь повторить ключи или что-то в этом роде, я получаю следующую ошибку...

import shelve

db = shelve.open("my.shelf")
ks = db.keys()
for k in ks: print(k)
...
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/_collections_abc.py", line 482, in __iter__
    yield from self._mapping
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/shelve.py", line 95, in __iter__
    for k in self.dict.keys():
SystemError: Negative size passed to PyBytes_FromStringAndSize

>>> list(ks.__dict__.values())[0].dict
<_dbm.dbm object at 0x10037ef90>
>>> help(list(ks.__dict__.values())[0].dict)

>>> list(ks.__dict__.values())[0].dict.keys()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
SystemError: Negative size passed to PyBytes_FromStringAndSize

Это на OSX Yosemite. Питон 3.4

Есть ли способ исправить это или получить ключи и значения для размещения в более подходящем хранилище?


person Johnny    schedule 04.12.2014    source источник
comment
Похоже, ваш размер настолько велик, что преодолел целочисленный предел, поэтому стал отрицательным. У меня есть одно предложение: for k in ks: yield k -- использование ключевого слова yield создает генератор, который возвращает значение только тогда, когда он используется. simeonvisser.com/posts/   -  person NuclearPeon    schedule 30.03.2015


Ответы (1)


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

Поскольку сбой при сохранении объекта данных может повредить ваш файл db.

Затем,

db = shelve.open("my.shelf") for key in list_of_successfully_saved_obj's_name: val = db.get(key) ...

person purucat    schedule 14.09.2017