报错信息:
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))