如何向现有的LMDB追加数据?

我需要将大约100万张图片分批次,每次10000张,添加到这个数据集中。

我确定map_size设置有误,参考了这篇文章

我使用以下代码创建了数据集

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是一个事务对象        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()  # 如果numpy版本低于1.9使用.tostring()            datum.label = int(Y[i])            str_id = '{:08}'.format(i)            # 在Python 3中,encode是必需的            txn.put(str_id.encode('ascii'), datum.SerializeToString())        #pdb.set_trace()    return env

如何修改这段代码,使新数据添加到LMDB中而不是替换现有数据?当前方法会在相同位置替换数据。我已经使用env.stat()检查了生成后的长度。


回答:

让我进一步解释我上面的评论。

LMDB中的所有条目都是根据唯一键存储的,你的数据库已经包含了键i = 0, 1, 2, ...。你需要一种方法为每个i找到唯一的键。最简单的方法是找到现有数据库中最大的键,并在此基础上继续添加。

假设现有键是连续的,

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

否则,更彻底的方法是遍历所有键。(查看这里

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

最后,只需将你的for循环中的第7行,

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

替换为

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

即可向现有数据库追加数据。

Related Posts

Keras Dense层输入未被展平

这是我的测试代码: from keras import…

无法将分类变量输入随机森林

我有10个分类变量和3个数值变量。我在分割后直接将它们…

如何在Keras中对每个输出应用Sigmoid函数?

这是我代码的一部分。 model = Sequenti…

如何选择类概率的最佳阈值?

我的神经网络输出是一个用于多标签分类的预测类概率表: …

在Keras中使用深度学习得到不同的结果

我按照一个教程使用Keras中的深度神经网络进行文本分…

‘MatMul’操作的输入’b’类型为float32,与参数’a’的类型float64不匹配

我写了一个简单的TensorFlow代码,但不断遇到T…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注