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

时间:2017-07-12 18:03:05

标签: python caffe lmdb

我的数据集包含71,000个大小为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_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 !!但它仍然没有数据!

0 个答案:

没有答案