【问题标题】:Is it possible to detect corrupt Python dictionaries是否可以检测损坏的 Python 字典
【发布时间】:2017-09-02 20:58:56
【问题描述】:

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

问题是,我怎样才能测试 dict 并避免挂起?

顺便说一句,我仍然有原始文件,当它复制到其他机器时会表现出相同的行为,以防万一有人也想首先帮助我了解文件的实际问题!

【问题讨论】:

标签: python


【解决方案1】:

我不知道除dbm.whichdb() 之外的任何检查方法。要以允许您超时长时间运行的测试的方式调试可能的 pickle protocol 不匹配,可以尝试:

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

【讨论】:

  • 不幸的是 whichdb() 为工作和损坏的数据库返回 'dbhash'。另外,whichdb 在 python2.7 的 whichdb 模块中。不过我喜欢关于超时的想法。
猜你喜欢
  • 2012-04-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-29
  • 2012-08-31
  • 2010-10-11
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
相关资源
最近更新 更多