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

标签 python machine-learning caffe pycaffe lmdb

我有大约 100 万张图像要放入此数据集中,每次附加 10000 张。

我确信来自此 article 的 ref 的 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 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

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

最佳答案

让我对上面的评论进行扩展。

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

假设现有键是连续的,

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

否则,更彻底的方法是遍历所有键。 ( Check this. )

max_key = 0
for 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)

附加到现有数据库。

关于python - 如何将数据附加到现有的 LMDB?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34822152/

相关文章:

python - 如何强制 matplotlib 更新绘图

python - 在 CircleCI 上运行 pytest-qt

python - 想知道 pd.factorize、pd.get_dummies、sklearn.preprocessing.LableEncoder 和 OneHotEncoder 之间的区别

linux - Tensorflow 推荐的系统规范?

python - 如何为 Keras 中的每个输出应用 sigmoid 函数?

c++ - 使用 Caffe 对图像中的手写数字进行分类

python - 在caffe中使用HDF5数据训练模型时出错

python - 如何向 Airflow 添加新的 DAG?

python - 如何在创建目录时显示消息?

image-processing - 咖啡resnet50 : I don't want resizing to 256 and cropping 224?