2016-01-16 25 views
6

Ho circa 1 milione di immagini da inserire in questo set di dati 10000 alla volta aggiunti al set.come aggiungere dati a LMDB esistente?

I "sicuro che l'map_size è sbagliato con rif da questo article

utilizzato questa linea per creare il set

env = lmdb.open(Path+'mylmdb', map_size=int(1e12) 

uso questa linea ogni 10000 di esempio per scrivere i dati in un file dove X e Y sono segnaposto per i dati che devono essere messi in LMDB.

env = create(env, X[:counter,:,:,:],Y,counter) 


def create(env, X,Y,N): 
    with env.begin(write=True) as txn: 
     # txn is a Transaction object 
     for i in range(N): 
      datum = caffe.proto.caffe_pb2.Datum() 
      datum.channels = X.shape[1] 
      datum.height = X.shape[2] 
      datum.width = X.shape[3] 
      datum.data = X[i].tostring() # or .tostring() if numpy < 1.9 
      datum.label = int(Y[i]) 
      str_id = '{:08}'.format(i) 

      # The encode is only essential in Python 3 
      txn.put(str_id.encode('ascii'), datum.SerializeToString()) 
     #pdb.set_trace() 
    return env 

come posso modificare il codice in modo che nuovi dati si aggiunge a questa LMDB e non sostituito ° è presente il metodo lo sostituisce nella stessa posizione. Ho controllato la lunghezza dopo la generazione con env.stat().

+2

Se si conosce la lunghezza e sapere che tutti i record esistenti hanno id inferiore alla lunghezza, perché non si può sostituire la linea 'str_id = '{: 08}' formato (i)' 'per str_id = '{. :. 08}' formato (existing_length + 1 + i) '? –

+0

Thanks you questo ha funzionato :) @SudeepJuvekar –

risposta

4

Espandere il mio commento sopra.

Tutte le voci LMDB vengono memorizzate in base alle chiavi univoche e il database contiene già le chiavi per i = 0, 1, 2, .... È necessario un modo per trovare chiavi univoche per ogni i. Il modo più semplice per farlo è trovare la chiave più grande nel DB esistente e continuare ad aggiungerla.

Supponendo che le chiavi esistenti sono consecutive,

max_key = env.stat()["entries"] 

In caso contrario, un approccio più approfondito è quello di iterare su tutti i tasti. (Check this.)

max_key = 0 
for key, value in env.cursor(): 
    max_key = max(max_key, key) 

Infine, è sufficiente sostituire la linea 7 del for ciclo,

str_id = '{:08}'.format(i) 

da

str_id = '{:08}'.format(max_key + 1 + i) 

da aggiungere al database esistente.

+1

Poiché le chiavi sono ordinati, perché non utilizzare 'ultima()' poi il tasto '()' per trovare la chiave più grande? – CarpetPython