2017-12-29 9 views
2

Ich versuche, eine LMDB mit 6 verketteten Bildern als Etiketten zu erstellen. Mein Python-Skript sieht wie folgt aus:Limit RAM-Nutzung beim Erstellen LMDB

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() 

Ich habe zwei Probleme:

  1. Wie groß sollte die map_size sein? Ich habe rund 140.000 Etiketten. Jedes Bild innerhalb des Labels hat eine Größe von 45 x 45. Da ich nur eine Dimension jedes Bildes verwende, denke ich, dass jedes Pixel ein Byte ist. Also meine Vermutung wäre, dass die map_size 45 * 45 * 6 * 140.000 Bytes sein sollte. Aber wenn ich die map_size auf diesen Wert setze, bekomme ich nach 528 Labels einen MapFullError: mdb_put: MDB_MAP_FULL: Environment mapsize limit reached.

  2. Wenn ich die map_size auf 1e12 setze, bekomme ich einen MapFullError nicht so schnell. Aber stattdessen wird die RAM-Nutzung zu fast 100%. Gibt es eine Möglichkeit, die RAM-Nutzung beim Erstellen einer lmdb zu begrenzen?

EDIT

die RAM-Auslastung zu reduzieren, ich über die LMDB iterieren versucht, so here beschrieben:

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() 

Aber immer noch die RAM-Nutzung wird zu 99% und das Schreiben der lmdb verlangsamt sich sehr stark.

Antwort

1

Ich habe meinen Fehler gefunden. Ich habe vergessen, das Array c nach jeder Iteration zurückzusetzen.

Verwandte Themen