我的数据集包含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 !!但它仍然没有数据!