lmdb.BadRslotError:mdb_txn_begin:MDB_BAD_RSLOT:无效地重用读取器锁定表插槽?

时间:2019-07-05 15:03:59

标签: python lmdb

我一直在尝试对in this post呈现的样式的图像进行最近邻算法(即目标是查看有多少几乎相似的图像)。在使示例适合我的情况运行之后,我几次看到错误“ lmdb.BadRslotError:mdb_txn_begin:MDB_BAD_RSLOT:无效地重用读取器可锁定表插槽” ,并且想知道是什么原因? / p>

我的假设是,它是由在同一运行中两次打开(相同)lmdb引起的(至少自从修复该问题以来没有出现过),但并不确定。 in another forum是为数不多的搜索命中之一,但答案是不确定的。

因此错误来自.begin语句:

fn_lmdb = fn + '.lmdb'  # stores word <-> id mapping
env = lmdb.open(fn_lmdb, map_size=int(1e9))

with env.begin() as txn:
    ... 

当我移至起点附近的那一刻时,该错误尚未出现,但是不确定是我解决了原因还是只是一种症状……您偶然发现了这个问题,解决方案是什么?

1 个答案:

答案 0 :(得分:2)

我在Python中与多进程一起运行时遇到了同样的问题。 由于这可能是唯一与该错误相关的问题,因此找到解决方案并不容易。 最终,我在github上收到了请求请求 并按照documentation在我的代码中进行了更改:

lmdb.open(db_dir, create=False, subdir=True, readonly=True, lock=False)

锁定: 如果为False,请不要进行任何锁定。如果预计将进行并发访问,则调用方必须自行管理所有并发。为了进行适当的操作,调用者必须执行单写者语义,并且必须确保在写者处于活动状态时,没有任何读者在使用旧事务。最简单的方法是使用排他锁,以便在编写者开始工作时根本没有任何读者处于活动状态。

我的交易是只读的,因此该解决方案适用于我。

我不知道是什么引起了这个问题,根据文档,我的理解是锁文件中的锁不是由lmdb包或Python管理的,而事务只是试图写入同一文件放在文件中。

希望它可以对某人有所帮助,因为此修复程序我再也没有遇到此问题。因此,目前看来,它可以正常工作。