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。您可以从该代码中提取模式。但通常更容易确保您永远不会打开同一个文件两次。
我一直在尝试使用最近邻算法来处理具有所呈现样式的图像 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。您可以从该代码中提取模式。但通常更容易确保您永远不会打开同一个文件两次。