lmdb.badrsloterror:mdb_txn_begin:mdb_bad_rslot:读取器锁定插槽的无效重复使



我一直在尝试最近的邻居算法,以获取具有本文中呈现样式的图像(即目标是查看有多少几乎相似的图像(。在适应了我的案件运行后,我已经看到了几次错误" lmdb.badrsloterror:mdb_txn_begin:mdb_bad_rslot:无效的读者锁定插槽的重复使用"/p>

我的假设是,它是由于在同一运行中两次打开(相同的(LMDB引起的(至少自修复以来就没有出现(,但不确定。在另一个论坛中给出了少数几个搜索命中之一,但答案不是确定的。

因此,错误来自.begin语句:

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

目前,我在开始旁边开了开放后,尚未出现错误,但不确定我是否解决了原因或仅仅是症状...您是否偶然发现了这一问题,解决方案是什么?

我遇到了同样的问题,在Python中使用多进程运行。由于这也许是唯一与此错误有关的问题,因此找到解决方案并不容易。最终我在github上达到了这个拉动请求并在文档中对我的代码进行了更改:

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

锁: 如果是错误的,请不要锁定。如果预计并发访问,呼叫者必须管理所有并发本身。为了进行正确的操作,呼叫者必须执行单作者语义,并且必须确保在作者处于活动状态时没有读者在使用旧事务。最简单的方法是使用独家锁,以便在作者开始时根本没有读者可以活跃。

我的交易已被阅读,因此解决方案对我有用。

我不知道是什么原因引起了问题,我根据文档的理解是,锁定文件中的锁不会由LMDB软件包或Python管理,而交易只是试图写入相同的锁放在文件中。

希望它能对某人有所帮助,因为修复程序我还没有遇到这个问题。因此,目前似乎可以工作。

当您从同一过程中两次打开同一文件时,就会发生此问题。唯一的解决方案是不这样做。在打开另一个文件之前,请确保close()文件,或重复使用LMDB env Object。

我在https://github.com/allenai/allennlp/blob/main/main/allennlp/common/file_utils.py.utils.py#l589上放了一个解决方案。您可以从该代码中进行模式。但是通常要确保您永远不会两次打开同一文件。

更容易。

最新更新