是否有可能检测到损坏的Python字典

时间:2017-04-07 12:53:46

标签: python

我有一个使用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

问题是,如何测试字典并避免挂起?

顺便说一句,我仍然有原始文件,并且在复制到其他计算机时表现出相同的行为,以防有人也想帮助我深入了解第一个文件的实际错误。放置!

1 个答案:

答案 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()