2014-12-04 77 views
2

我一直在使用Shelve作爲文檔存儲。 該鍵是一個字符串化的整數,該值只是字符串中的一些html。不幸的是,我的腳本最終在db中放入了這麼多條目,以致發生錯誤(我沒有準確的那些)。分貝大約是36GB的大小,現在當我加載它,然後嘗試和迭代上的按鍵或像我碰到下面的錯誤什麼...如何從可能損壞或太大的Python Shelve db中恢復數據?

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優勝美地。 Python 3.4

有沒有辦法修復這個問題,或者把鍵和值拿出來放到更合適的商店?

+0

它看起來像你的尺寸是如此之大,它克服了整數限制,因此進入負數。我有一個建議是這樣做的:'for k in ks:yield k' - 使用'yield'關鍵字創建一個生成器,它在使用時只返回一個值。 http://simeonvisser.com/posts/python-3-using-yield-from-in-generators-part-1.html – NuclearPeon 2015-03-30 17:20:43

回答

0

您必須知道相應對象已成功存儲的鍵名稱。

因爲保存數據對象失敗會損壞你的數據庫。

然後,

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

相關問題