Ограничить использование оперативной памяти при создании LMDB


Я пытаюсь создать LMDB с 6 сцепленными изображениями в качестве меток. Мой скрипт на 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. Насколько большим должен быть размер карты? У меня около 140 000 этикеток. Каждое изображение внутри этикетки имеет размер 45 х 45. Поскольку я использую только одно измерение каждого изображения, я предполагаю, что каждый пиксель - это один байт. Поэтому я предполагаю, что размер карты должен быть 45*45*6*140,000 байты. Но если я установлю map_size на это значение, я получаю MapFullError: mdb_put: MDB_MAP_FULL: Environment mapsize limit reached после 528 меток.

  2. Если я установлю map_size в 1e12, я не получу MapFullError так быстро. Но вместо этого использование оперативной памяти идет почти на 100%. есть ли способ ограничить использование ОЗУ при создании lmdb?

EDIT

Чтобы уменьшить использование оперативной памяти, я попытался перебрать 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()

Но все же использование ОЗУ достигает 99%, и запись lmdb очень замедляется.

1 2

1 ответ:

Я обнаружил свою ошибку. Я забыл сбросить массив c после каждой итерации.