我有一个使用python 2.7中的shelve模块保存的数据文件,它有点腐败。我可以使用db = shelve.open('file.db')
加载它,但是当我调用len(db)
或甚至bool(db)
时,它会挂起,我必须终止该过程。
但是,我能够遍历整个事情并创建一个新的非损坏文件:
db = shelve.open('orig.db')
db2 = shelve.open('copy.db')
for k, v in db.items():
db2[k] = v
db2.close() # copy.db will now be a fully working copy
问题是,如何测试字典并避免挂起?
顺便说一句,我仍然有原始文件,并且在复制到其他计算机时表现出相同的行为,以防有人也想帮助我深入了解第一个文件的实际错误。放置!答案 0 :(得分:1)
我不知道link3以外的任何检查方法。要以允许超时长时间运行测试的方式调试可能的dbm.whichdb()不匹配,请尝试:
import shelve
import pickle
import dbm
import multiprocessing
import time
import psutil
def protocol_check():
print('orig.db is', dbm.whichdb('orig.db'))
print('copy.db is', dbm.whichdb('copy.db'))
for p in range(pickle.HIGHEST_PROTOCOL + 1):
print('trying protocol', p)
db = shelve.open('orig.db', protocol=p)
db2 = shelve.open('copy.db')
try:
for k, v in db.items():
db2[k] = v
finally:
db2.close()
db.close()
print('great success on', p)
def terminate(grace_period=2):
procs = psutil.Process().children()
for p in procs:
p.terminate()
gone, still_alive = psutil.wait_procs(procs, timeout=grace_period)
for p in still_alive:
p.kill()
process = multiprocessing.Process(target=protocol_check)
process.start()
time.sleep(10)
terminate()