如何将数据附加到现有的LMDB?

Ars*_*tic 6 python machine-learning lmdb caffe pycaffe

我有大约100万张图像放在这个数据集10000中,一次附加到集合中.

我确定map_size与本文的参考文献有关

使用此行创建集合

env = lmdb.open(Path+'mylmdb', map_size=int(1e12)
Run Code Online (Sandbox Code Playgroud)

每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
Run Code Online (Sandbox Code Playgroud)

如何编辑此代码,以便将新数据添加到此LMDB而不替换,因为此方法将其替换为相同位置.我用env.stat()检查了生成后的长度.

Sud*_*kar 5

让我扩展一下我上面的评论。

LMDB 中的所有条目均根据唯一键存储,并且您的数据库已包含i = 0, 1, 2, .... 您需要一种方法来找到每个的唯一键i。最简单的方法是找到现有数据库中最大的键并不断添加到其中。

假设现有的键是连续的,

max_key = env.stat()["entries"]
Run Code Online (Sandbox Code Playgroud)

否则,更彻底的方法是迭代所有键。(检查一下。

max_key = 0
for key, value in env.cursor():
    max_key = max(max_key, key)
Run Code Online (Sandbox Code Playgroud)

最后,只需替换for循环的第 7 行,

str_id = '{:08}'.format(i)
Run Code Online (Sandbox Code Playgroud)

经过

str_id = '{:08}'.format(max_key + 1 + i)
Run Code Online (Sandbox Code Playgroud)

追加到现有数据库。

  • 既然键已排序,为什么不使用“last()”然后使用“key()”来找到最大的键呢? (2认同)