Python 如何在迭代后重新打开LMDB?

Python 如何在迭代后重新打开LMDB?,python,caffe,lmdb,Python,Caffe,Lmdb,我的数据集包含71000个大小为500MB的图像,我正在尝试将其放入LMDB for Caffe框架中。我使用了以下代码: with lmdb.open(train_lmdb, map_size=int(1e12)) as env: with env.begin(write=True) as in_txn: for in_idx, img_path in enumerate(train_data): ... ... ... da

我的数据集包含71000个大小为500MB的图像,我正在尝试将其放入LMDB for Caffe框架中。我使用了以下代码:

with lmdb.open(train_lmdb, map_size=int(1e12)) as env:
    with env.begin(write=True) as in_txn:
        for in_idx, img_path in enumerate(train_data):
           ... ... ...
           datum = make_datum(img, label)
           in_txn.put('{:0>5d}'.format(in_idx), datum.SerializeToString())
    env.close()
train\u data
是图像文件的列表

但问题是,过了一些时候,我的8G内存就满了,Ubuntu就冻结了

我读到我们应该关闭并重新打开它,但它(据我所知)在读取所有数据时将所有数据放入数据库中(数据库文件大小直到最后才改变)。我的记忆比数据集还大

我的问题是:有没有办法重新打开数据库并保存当前状态以在重新打开时恢复它?有没有办法告诉LMDB在一个接一个地(而不是在同一时间)读取每个元组后,将其放入db中?为什么它需要这么多内存

PS:当我将其放入for循环时:

if counter%1000 == 0 :
        env.close()
        env = lmdb.open(train_lmdb, map_size=int(1e12))
        in_txn = env.begin(write=True)
它将结束,但数据库文件为空


PS2:我试图将
writemap=True
传递到
lmdb。open
它将lmdb的大小增加到1TB!!但是里面还是没有数据

你找到答案了吗?你必须在某个时候提交,否则你将无法写入数据库。@thigi,不幸的是没有。我改为直接向Caffe提供图像,这太慢了,但它完成了任务。你只需在关闭数据库之前添加
env.commit()
,它就应该这样做了work@thigi ,事实上,我想我做到了,它放了肮脏的记录,其中很多都是复制的,所以我放弃了。对不起,那是很久以前的事了,我几乎不记得了,但我很快会再试一次。