将某些值分配给我程序字典中的某些键时,我遇到了一个奇怪的错误(该字典已搁置,目前大约有 14000 个条目),这是我粘贴在本文底部的示例输出。简单的例子是如果我尝试
dict["-34_45_2_2"] = 1.1
在这一行立即抛出错误,但如果我使用相同的键和不同的值,例如
dict["-34_45_2_2"] = 1.5
很好。我已经使用不同的类型、值和键来解决这个问题,但没有找到任何模式来解释为什么某些组合会发生这些错误(另一个例子是值 -1.0 很好,但 -1.1 抛出错误)。
如果我尝试反之亦然,即修复值但更改键,我发现类似的事情发生在某些键导致错误但其他键(有趣的是,大多数)似乎没问题的情况下。
我的程序的快速概述是,我正在对一堆粒子及其相互作用进行蒙特卡罗模拟,后者是通过 numpy 积分计算的(并返回常规的 python 浮点数)。粒子的相对位置用作字典键(并定义为字符串,如我上面的 2 个示例),而交互用作与其关联的值(常规 python 浮点数)。
最后,这是错误输出的示例:
Traceback (most recent call last):
File "potts_all_neighbours.py", line 201, in <module>
sys.relax(Ef, de1,deab_dict, cell_l, cell_r,Temp)
File "potts_all_neighbours.py", line 77, in relax
dic["-34_45_2_2"] = 1.1
File "/usr/lib/python2.7/shelve.py", line 133, in __setitem__
self.dict[key] = f.getvalue()
File "/usr/lib/python2.7/bsddb/__init__.py", line 279, in __setitem__
_DeadlockWrap(wrapF) # self.db[key] = value
File "/usr/lib/python2.7/bsddb/dbutils.py", line 68, in DeadlockWrap
return function(*_args, **_kwargs)
File "/usr/lib/python2.7/bsddb/__init__.py", line 278, in wrapF
self.db[key] = value
bsddb.db.DBRunRecoveryError: (-30973, 'DB_RUNRECOVERY: Fatal error, run database recovery -- PANIC: Invalid argument')
Exception bsddb.db.DBRunRecoveryError: DBRunRecoveryError(-30973, 'DB_RUNRECOVERY: Fatal error, run database recovery -- PANIC: fatal region error detected; run recovery') in ignored
Exception bsddb.db.DBRunRecoveryError: DBRunRecoveryError(-30973, 'DB_RUNRECOVERY: Fatal error, run database recovery -- PANIC: fatal region error detected; run recovery') in ignored
最佳答案
我收到了类似的错误。经过一些调试,结果发现(无意中) 两个实例在“c”模式下使用相同的搁置数据库文件(如果不存在,则为R+W +create)。
通过停止两个实例并在将它们配置为使用不同的搁置 db 文件后将它们重新启动来解决该问题。
关于Python 2.7 程序(带有搁置的字典)为特定的键和值组合返回致命的 "dbrunrecoveryerror",但不返回其他组合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29152952/