我需要将大约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)
即可向现有数据库追加数据。