Python 如何将数据附加到现有的LMDB?
我有大约100万张图片要放在这个数据集中,每次添加10000张图片到集合中 我敢肯定地图的大小和这个的参考值是错误的 使用此行创建集合Python 如何将数据附加到现有的LMDB?,python,machine-learning,caffe,pycaffe,lmdb,Python,Machine Learning,Caffe,Pycaffe,Lmdb,我有大约100万张图片要放在这个数据集中,每次添加10000张图片到集合中 我敢肯定地图的大小和这个的参考值是错误的 使用此行创建集合 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.be
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
env=create(env,X[:counter,:,:,:,:],Y,counter)
def创建(环境、X、Y、N):
将env.begin(write=True)作为txn:
#txn是一个事务对象
对于范围(N)中的i:
datum=caffe.proto.caffe_pb2.datum()
datum.channels=X.shape[1]
基准高度=X形状[2]
基准面宽度=X形[3]
datum.data=X[i].tostring()#或.tostring(),如果numpy<1.9
datum.label=int(Y[i])
str_id='{:08}'。格式(i)
#编码仅在Python3中是必需的
txn.put(str_id.encode('ascii'),datum.SerializeToString())
#pdb.set_trace()
返回环境
如何编辑此代码,以便将新数据添加到此LMDB,而不是替换为当前方法在相同位置替换它。
我已经用env.stat()检查了生成后的长度。请允许我在上面的评论中展开 LMDB中的所有条目都是根据唯一键存储的,并且您的数据库已经包含
i=0、1、2、
的键。您需要一种方法来查找每个i
的唯一键。最简单的方法是查找现有DB中最大的键并不断添加到其中
假设现有键是连续的
max_key = env.stat()["entries"]
否则,更彻底的方法是迭代所有键。()
最后,只需为循环替换的第7行
str_id = '{:08}'.format(i)
借
追加到现有数据库。如果您知道长度,并且知道所有现有记录的id都小于该长度,为什么不能将行stru id='{:08}'。替换为stru id='{:08}'。格式(i)
?感谢您的帮助:)@sudeepjuvakara当密钥被排序后,为什么不使用last()
然后key()
来查找最大的密钥呢?
str_id = '{:08}'.format(i)
str_id = '{:08}'.format(max_key + 1 + i)