Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将数据附加到现有的LMDB?_Python_Machine Learning_Caffe_Pycaffe_Lmdb - Fatal编程技术网

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

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

我有大约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.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)