2016-01-16 5 views
6

У меня есть около 1 миллиона изображений, чтобы добавить в этот набор данных 10000 за один раз, прилагаемый к набору.Как добавить данные в существующие LMDB?

Я "м уверен, что map_size неправильно с реф от этого article

использовал эту строку, чтобы создать набор

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

использовать эту линию каждые 10000 образцов для записи данных в файл, где X и Y заполнители для данных, которые будут ставить в 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 

Как я могу изменить этот код таким образом, что новые данные добавляются в этот LMDB и не была заменена, этот настоящий метод заменяет его в том же положении. Я проверил длину за поколением с помощью env.stat().

+2

Если вы знаете длину и знаете, что все существующие записи имеют идентификаторы меньше длины, почему вы не можете заменить строку 'str_id = '{: 08}'. Format (i)' by 'str_id = '{ : 08} '. Format (existing_length + 1 + i) '? –

+0

Спасибо, что это сработало :) @SudeepJuvekar –

ответ

4

Le me на мой комментарий выше.

Все записи в LMDB хранятся в соответствии с уникальными ключами, и ваша база данных уже содержит ключи для i = 0, 1, 2, .... Вам нужно найти уникальные ключи для каждого i. Самый простой способ сделать это - найти самый большой ключ в существующей БД и продолжать добавлять к нему.

Если предположить, что существующие ключи являются последовательными,

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

В противном случае, более тщательный подход для перебора всех ключей. (Check this.)

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

Наконец, просто заменить строку 7 вашего for петли,

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

по

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

для добавления к существующей базе данных.

+1

Как ключи сортируются, почему бы не использовать 'last()' then' key() ', чтобы найти самый большой ключ? – CarpetPython

Смежные вопросы