Check failed: mdb_status == 0 (5 vs. 0) Input/output error错误解决

在使用Caffe制作lmdb数据集时遇到Input/output error错误,通过检查磁盘空间并清理,成功解决了问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Check failed: mdb_status == 0 (5 vs. 0) Input/output error错误解决

在制作caffe的lmdb数据时,数据生成到一半报错:
信息如下:

I0305 20:57:55.481330 19131 convert_imageset.cpp:147] Processed 302000 files.
F0305 20:58:08.753790 19131 db_lmdb.hpp:15] Check failed: mdb_status == 0 (5 vs. 0) Input/output error
*** Check failure stack trace: ***
    @     0x7f432e40c624  google::LogMessage::Fail()
    @     0x7f432e40c56b  google::LogMessage::SendToLog()
    @     0x7f432e40bf3f  google::LogMessage::Flush()
    @     0x7f432e40f2a5  google::LogMessageFatal::~LogMessageFatal()
    @     0x7f432e8fd767  caffe::db::LMDBTransaction::Commit()
    @           0x403fa3  main
    @     0x7f432d412830  (unknown)
    @           0x404cd9  _start
Aborted (core dumped)

后来用

df -hl

命令查看linux磁盘空间,发现磁盘空间已满,删除掉一些东西,留下足够空间,就可以正常跑程序了。

### LMDB中Assertion Failed错误的原因与解决方案 LMDB(Lightning Memory-Mapped Database)是一种嵌入式键值存储库,广泛应用于高性能场景。当遇到 `Assertion failed on expression: 'errors == MDB_SUCCESS || errors == MDB_NOTFOUND'` 错误时,通常表明在数据库操作过程中出现了未预期的状态或条件[^1]。 #### 错误原因分析 1. **事务提交冲突** 如果在同一事务中多次调用 `mdb_txn_commit`,可能会导致 `Asset database transaction committed twice!` 的错误提示。这是因为 LMDB 不允许对同一事务进行多次提交操作[^2]。 2. **数据库状态异常** 当数据库的返回值既不是 `MDB_SUCCESS` 也不是 `MDB_NOTFOUND` 时,断言会失败。这通常意味着在数据库操作中遇到了其他类型的错误,例如文件损坏、权限问题或内存不足等[^1]。 3. **环境配置问题** 在某些情况下,开发环境或运行时环境的配置可能导致此类错误。例如,Unity 中的许可证过期或未正确激活可能会间接影响 LMDB 的正常运行。 #### 解决方案 1. **检查事务管理逻辑** 确保每个事务只被提交一次。可以通过代码逻辑避免重复调用 `mdb_txn_commit`。例如: ```c if (txn != NULL) { mdb_txn_commit(txn); txn = NULL; } ``` 2. **验证数据库完整性** 使用 LMDB 提供的工具(如 `mdb_stat` 或 `mdb_dump`)检查数据库文件是否损坏。如果发现损坏,可以尝试恢复或重新初始化数据库[^1]。 3. **更新运行环境** 确保使用的是最新版本的 LMDB 库,并检查运行时环境是否存在兼容性问题。对于 Unity 用户,确保许可证处于有效状态并已正确激活。 4. **捕获并处理错误** 在代码中添加错误处理逻辑,捕获非预期的返回值并记录日志以便后续排查。例如: ```c int rc = mdb_get(txn, dbi, &key, &data); if (rc != MDB_SUCCESS && rc != MDB_NOTFOUND) { fprintf(stderr, "Error in mdb_get: %s\n", mdb_strerror(rc)); } ``` 5. **清理残留资源** 如果问题仍然存在,尝试清理可能的残留资源,例如删除临时文件或重启应用程序以释放锁定的资源[^1]。 ### 示例代码:事务管理改进 以下是一个改进后的事务管理示例,避免重复提交: ```c #include <lmdb.h> #include <stdio.h> void safe_commit(MDB_txn* txn) { if (txn != NULL) { int rc = mdb_txn_commit(txn); if (rc != MDB_SUCCESS) { fprintf(stderr, "Transaction commit failed: %s\n", mdb_strerror(rc)); } txn = NULL; } } int main() { MDB_env* env; MDB_dbi dbi; MDB_txn* txn = NULL; MDB_val key, data; // 初始化环境和数据库 mdb_env_create(&env); mdb_env_open(env, "./example.mdb", 0, 0664); mdb_txn_begin(env, NULL, 0, &txn); mdb_dbi_open(txn, NULL, 0, &dbi); // 数据操作逻辑 key.mv_size = sizeof(int); key.mv_data = (void*)&some_key; int rc = mdb_get(txn, dbi, &key, &data); if (rc != MDB_SUCCESS && rc != MDB_NOTFOUND) { fprintf(stderr, "Error in mdb_get: %s\n", mdb_strerror(rc)); } // 安全提交事务 safe_commit(txn); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值