2016-01-16 35 views
6

私はこのデータセットに約100万枚の画像をセットし、一度にセットに追加しました。既存のLMDBにデータを追加する方法は?

は、私が「map_sizeは、ここで、XとYのファイルにデータを書き込むための

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

使用このラインごとに10000サンプルをセットを作成するには、この行を使用し、このarticle

からREFと間違っている確信しています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

長さを知っていて、すべての既存のレコードの長さがIDの長さより短い場合は、なぜstr_id = '{:08}'。format(i) '行を{str_id = '{ :08} '。書式(existing_length + 1 + i) '? –

+0

ありがとうございます:) @SudeepJuvekar –

答えて

4

私は上記のコメントを展開します。

LMDBのすべてのエントリは一意のキーに従って格納され、データベースにはすでにi = 0, 1, 2, ...のキーが含まれています。各iのユニークなキーを見つける方法が必要です。これを行う最も簡単な方法は、既存のDBで最大の鍵を見つけて追加し続けることです。既存のキーが連続していると仮定すると

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

はそうでない場合は、より徹底したアプローチは、すべてのキーを反復処理することです。 ( Check this.

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

最後に、単に既存のデータベースに追加する

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

により、

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

をごforループのライン7を交換してください。

+1

キーがソートされているので、最大のキーを見つけるのに 'last()'と 'key()'を使わないのはなぜですか? – CarpetPython

関連する問題