2016-01-16 12 views
6

Mam około 1 miliona obrazów, aby umieścić w tym zestawie danych 10000 w czasie dołączonym do zestawu.jak dołączyć dane do istniejącego LMDB?

ja "jestem pewien, że map_size jest nie tak z dopiskiem od tego article

stosowanego tę linię, aby utworzyć zestaw

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

wykorzystanie tej linii każdy 10.000 próbek do zapisu danych do pliku, w którym X i Y są zastępcze dla danych, które mają być wprowadzone w 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 

jak mogę edytować ten kod tak, że nowe dane są dodawane do tej LMDB i nie otrzymuje th jest obecna metoda zastępuje go w tej samej pozycji. Mam sprawdzić długość po generacji za pomocą env.stat().

+2

Jeśli znasz długość i wiesz, że wszystkie istniejące rekordy mają id mniej niż długość, dlaczego nie możesz zastąpić wiersza 'str_id = '{: 08}'. Format (i)' by 'str_id = '{ : 08} '.format (existing_length + 1 + i) '? –

+0

Dziękuję Ci, że to zadziałało :) @SudeepJuvekar –

Odpowiedz

4

Proszę o rozwinięcie mojego komentarza powyżej.

Wszystkie pozycje w LMDB są przechowywane zgodnie z unikalnymi kluczami, a twoja baza danych zawiera już klucze do i = 0, 1, 2, .... Potrzebujesz sposobu na znalezienie unikalnych kluczy dla każdego i. Najprostszym sposobem na to jest znalezienie największego klucza w istniejącym DB i dalsze dodawanie do niego.

Zakładając, że istniejące klucze są kolejne,

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

Inaczej, bardziej gruntowne podejście iteracyjne nad wszystkie klucze. (Check this.)

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

Wreszcie, po prostu zastąpić linię 7 Twojego pętli for,

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

przez

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

dołączyć do istniejącej bazy danych.

+1

Ponieważ klawisze są posortowane, dlaczego nie użyć 'last()', a następnie 'key()', aby znaleźć największy klucz? – CarpetPython

Powiązane problemy