lmdb.BadRslotError: mdb_txn_begin: MDB_BAD_RSLOT: Invalid reuse of reader locktable slot?

lmdb.BadRslotError: mdb_txn_begin: MDB_BAD_RSLOT: Invalid reuse of reader locktable slot?

我一直在尝试使用最近邻算法来处理具有所呈现样式的图像 in this post(即目标是查看有多少几乎相似的图像)。在得到适合我的案例 运行ning 的例子后,我看到了几次错误 "lmdb.BadRslotError: mdb_txn_begin: MDB_BAD_RSLOT: Invalid reuse of reader locktable slot" ,想知道是什么原因?

我的假设是它是由于在同一个 运行 中打开(相同的)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:
    ... 

在我打开开始旁边的那一刻,错误还没有出现,但不确定我是否修复了原因或只是一个症状......你是否偶然发现了这个,是什么解决方案?

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

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

lock: If False, don’t do any locking. If concurrent access is anticipated, the caller must manage all concurrency itself. For proper operation the caller must enforce single-writer semantics, and must ensure that no readers are using old transactions while a writer is active. The simplest approach is to use an exclusive lock so that no readers may be active at all when a writer begins.

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

我不知道是什么导致了这个问题,根据文档我的理解是锁文件中的锁不是由 lmdb 包或 Python 管理的,事务只是试图写入文件中的相同位置。

希望对大家有所帮助,自从修复后我再也没遇到过这个问题。所以目前它似乎工作。

当您从同一个进程打开同一个文件两次时会出现此问题。唯一的解决办法是不这样做。在打开另一个文件之前确保 close() 文件,或者重新使用 LMDB env 对象。

我在 https://github.com/allenai/allennlp/blob/main/allennlp/common/file_utils.py#L589 处将一个执行后者的解决方案放入 AllenNLP。您可以从该代码中提取模式。但通常更容易确保您永远不会打开同一个文件两次。