创建 LMDB 时限制 RAM 使用
Limit RAM usage while creating LMDB
我正在尝试创建一个带有 6 个连接图像作为标签的 LMDB。我的 python 脚本如下所示:
in_db = lmdb.open('image-lmdb', map_size=int(1e12), writemap=True)
with in_db.begin(write=True) as in_txn:
for in_idx, in_ in enumerate(inputs):
im = np.array(Image.open('train_label_1/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_2/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_3/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_4/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_5/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_6/' + in_))
im = im[:,:,1]
c.append(im)
d = np.array(c)
im_dat = caffe.io.array_to_datum(d)
in_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString())
in_db.close()
我有两个问题:
map_size应该多大?
我有大约 140,000 个标签。标签内的每个图像的大小为 45 x 45。因为我只使用每个图像的一个维度,所以我猜每个像素是一个字节。所以我的猜测是 map_size 应该是 45*45*6*140,000 字节。但是,如果我将 map_size 设置为此值,我会在 528 个标签后得到 MapFullError: mdb_put: MDB_MAP_FULL: Environment mapsize limit reached
。
如果我将 map_size 设置为 1e12,我不会很快收到 MapFullError。但相反,RAM 使用率接近 100%。 创建 lmdb 时是否有限制 RAM 使用的方法?
编辑
为了减少 RAM 使用量,我尝试按照 here:
中所述迭代 lmdb
for idx in range(int(math.ceil(len(inputs)/1000.0))):
in_db = lmdb.open('image-lmdb', map_size=int(1e12))#, writemap=True
with in_db.begin(write=True) as in_txn:
for in_idx, in_ in enumerate(inputs[(1000*idx):(1000*(idx+1))]):
im = np.array(Image.open('train_label_1/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_2/' + in_))
im = im[:,:,1]
c.append(im)
.
.
.
d = np.array(c)
im_dat = caffe.io.array_to_datum(d)
in_txn.put('{:0>10d}'.format(in_idx + idx * 1000), im_dat.SerializeToString())
in_db.close()
但是 RAM 使用率仍然达到 99%,并且 lmdb 的写入速度非常慢。
我发现了我的错误。我忘记在每次迭代后重置数组 c
。
我正在尝试创建一个带有 6 个连接图像作为标签的 LMDB。我的 python 脚本如下所示:
in_db = lmdb.open('image-lmdb', map_size=int(1e12), writemap=True)
with in_db.begin(write=True) as in_txn:
for in_idx, in_ in enumerate(inputs):
im = np.array(Image.open('train_label_1/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_2/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_3/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_4/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_5/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_6/' + in_))
im = im[:,:,1]
c.append(im)
d = np.array(c)
im_dat = caffe.io.array_to_datum(d)
in_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString())
in_db.close()
我有两个问题:
map_size应该多大? 我有大约 140,000 个标签。标签内的每个图像的大小为 45 x 45。因为我只使用每个图像的一个维度,所以我猜每个像素是一个字节。所以我的猜测是 map_size 应该是 45*45*6*140,000 字节。但是,如果我将 map_size 设置为此值,我会在 528 个标签后得到
MapFullError: mdb_put: MDB_MAP_FULL: Environment mapsize limit reached
。如果我将 map_size 设置为 1e12,我不会很快收到 MapFullError。但相反,RAM 使用率接近 100%。 创建 lmdb 时是否有限制 RAM 使用的方法?
编辑
为了减少 RAM 使用量,我尝试按照 here:
中所述迭代 lmdbfor idx in range(int(math.ceil(len(inputs)/1000.0))):
in_db = lmdb.open('image-lmdb', map_size=int(1e12))#, writemap=True
with in_db.begin(write=True) as in_txn:
for in_idx, in_ in enumerate(inputs[(1000*idx):(1000*(idx+1))]):
im = np.array(Image.open('train_label_1/' + in_))
im = im[:,:,1]
c.append(im)
im = np.array(Image.open('train_label_2/' + in_))
im = im[:,:,1]
c.append(im)
.
.
.
d = np.array(c)
im_dat = caffe.io.array_to_datum(d)
in_txn.put('{:0>10d}'.format(in_idx + idx * 1000), im_dat.SerializeToString())
in_db.close()
但是 RAM 使用率仍然达到 99%,并且 lmdb 的写入速度非常慢。
我发现了我的错误。我忘记在每次迭代后重置数组 c
。