创建LMDB时限制RAM使用

时间:2017-12-29 12:56:06

标签: caffe 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()

我有两个问题:

  1. 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

  2. 如果我将map_size设置为1e12,我就不会快速得到MapFullError。但相反,RAM使用量接近100%。 创建lmdb时是否有办法限制RAM使用?

  3. 修改

    为了减少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的写入速度非常慢。

1 个答案:

答案 0 :(得分:1)

我发现了自己的错误。我忘了在每次迭代后重置数组c