lmdb.MapFullError: mdb_put: MDB_MAP_FULL: Environment mapsize limit reached

报错信息:

lmdb.MapFullError: mdb_put: MDB_MAP_FULL: Environment mapsize limit reached
Write GOPR0884_11_00-000266_s006: 99%|█████████▉| 16670/16824 [11:18<00:06, 24.57chunk/s]


问题描述

报错信息

lmdb.MapFullError: mdb_put: MDB_MAP_FULL: Environment mapsize limit reached
Write GOPR0884_11_00-000266_s006:  99%|█████████▉| 16670/16824 [11:18<00:06, 24.57chunk/s]

原因分析:

提示:这里填写问题的分析:

写入的数据超出默认值,解决方法:
路径basicsr\utils\lmdb_util.py下115行
也可以自己在当前你工程下全局搜索一下

# 对map_size进行设置max_size为1e9kb(int(1e9)),大小可调整,也可以设置数,打印大小55483701360,按照自己电脑设置
env = lmdb.open(lmdb_path, map_size=int(1e9))

自己的理解分析:

个人理解:
图像映射的大小,这个map_size的大小应该是图像占多少个字节,可能和图片的size类似,这个大小是可以调整的,调整的大做映射消耗的时间就少。

官方代码解释:
map_size:
Maximum size database may grow to; used to size the memory mapping.
If database grows larger than map_size, an exception will be
raised and the user must close and reopen :py:class:Environment.
On 64-bit there is no penalty for making this huge (say 1TB). Must
be <2GB on 32-bit.
… note::

            **The default map size is set low to encourage a crash**, so
            users can figure out a good value before learning about this
            option too late.

翻译:
最大大小的数据库可能会增长到;用于调整内存映射的大小。如果数据库增长大于“map_size”,将引发异常,用户必须关闭并重新打开:py:class:Environment。在 64 位上,使这个巨大(比如 1TB)没有任何惩罚。在 32 位上必须小于 2GB

默认地图大小设置得较低以鼓励崩溃,因此用户可以在太晚了解此选项之前找出一个合适的值。

下面是map_size的计算方式:

 	# create lmdb environment
    if map_size is None:
        # obtain data size for one image
        img = cv2.imread(
            osp.join(data_path, img_path_list[0]), cv2.IMREAD_UNCHANGED)
        _, img_byte = cv2.imencode(
            '.png', img, [cv2.IMWRITE_PNG_COMPRESSION, compress_level])
        data_size_per_img = img_byte.nbytes
        print('Data size per image is: ', data_size_per_img)
        data_size = data_size_per_img * len(img_path_list)
        map_size = data_size * 10
        print("map_size {}".format(map_size))
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个软件错误信息,表示在代码中使用了assert语句,但是表达式的值为false,因此引发了断言失败错误。这意味着程序执行到了一个不应该到达的地方,可能是由于代码实现的问题或者其他原因导致的。具体问题需要更多的代码上下文才能确定。 ### 回答2: 这个错误信息通常出现在使用LMDB时,因为在处理过程中发现某些错误导致程序无法继续执行。其中,表达式'm_errorcode == mdb_map_resized'是指LMDB的内存映射被重新调整过,而'!hasabortingerrors()'则是指在处理过程中没有出现致命错误。 如果出现这个错误消息,通常是因为LMDB的内存映射重新调整了,这可能是因为其他进程对该数据库进行了更改,或者数据库中占用的内存空间不足,导致LMDB需要重新进行内存映射而出现错误。 此外,如果在处理过程中出现了致命错误,也会导致同样的错误消息。如果出现致命错误,程序通常会返回一个非零值,表示出现错误。 要解决这个问题,可以尝试增加LMDB的缓存大小,或者调整数据库中记录的大小。另外,可以使用LMDB提供的错误处理机制来处理出现的错误,避免程序崩溃。同时,也建议使用LMDB最新版本,因为最新版本已经修复了一些旧版本存在的问题。 ### 回答3: “assertion failed on expression: 'm_errorcode == mdb_map_resized || !hasabortingerrors()'"是一个错误消息,可能出现在某些使用了LMDB(轻量级嵌入式数据库)的应用程序中。 在这个错误消息中,“assertion failed”的意思是某个条件没有被满足,应用程序不能继续运行。具体来说,“assertion”是指代码中的一个检查点,用于确保某个条件得到满足。如果条件不满足,就会发生“assertion failed”错误。 在这个特定的错误消息中,“m_errorcode == mdb_map_resized || !hasabortingerrors()”是被检查的条件,即代码正在检查LMDB数据库的错误状态。如果LMDB数据库的错误代码为“mdb_map_resized”,那么条件得到满足,否则代码需要检查是否有“aborting errors”(可中止的错误),如果没有则条件也得到满足。 “mdb_map_resized”是一种LMDB错误代码,指示数据库文件的大小已经改变,需要重新映射该文件。如果LMDB数据库的错误代码不是这个值,那么代码必须检查是否有可中止的错误。如果有,这意味着这个错误会导致程序退出,因此不需要检查其他错误。否则,程序将继续运行。 如果出现“assertion failed on expression: 'm_errorcode == mdb_map_resized || !hasabortingerrors()'”,这意味着代码无法继续执行。这个错误消息可能是LMDB库产生的,也可能是应用程序自身的问题。要解决这个问题,需要检查代码,找出为什么没有满足检查条件,然后修改代码,确保检查条件得到满足。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值