将某些值分配给我程序字典中的某些键时,我遇到了一个奇怪的错误(该字典已搁置,目前大约有 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/

10-12 00:35