概述
我做错了什么吗?有什么我不知道的吗?
这是我创建LMDB的代码:
DB_KEY_FORMAT = "{:0>10d}" db = lmdb.open(path,map_size=int(1e12)) curr_idx = 0 commit_size = 1000 for curr_commit_idx in range(0,num_data,commit_size): with in_db_data.begin(write=True) as in_txn: for i in range(curr_commit_idx,min(curr_commit_idx + commit_size,num_data)): d,l = data[i],labels[i] im_dat = caffe.io.array_to_datum(d.astype(float),label=int(l)) key = DB_KEY_FORMAT.format(curr_idx) in_txn.put(key,im_dat.SerializeToString()) curr_idx += 1 db.close()
正如您所看到的,我正在为每1,000个图像创建一个事务,因为我认为为每个图像创建一个事务会产生开销,但似乎这不会对性能产生太大影响.
一些代码可以帮助您动态创建,填充和移动LMDB到存储.随意编辑它以适合您的情况.它可以节省你一些时间来了解LMDB和文件操作如何在Python中工作.
import shutil import lmdb import random def move_db(): global image_db image_db.close(); rnd = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(5)) shutil.move( fold + 'ram/train_images','/storage/lmdb/'+rnd) open_db() def open_db(): global image_db image_db = lmdb.open(os.path.join(fold,'ram/train_images'),map_async=True,max_dbs=0) def write_to_lmdb(db,key,value): """ Write (key,value) to db """ success = False while not success: txn = db.begin(write=True) try: txn.put(key,value) txn.commit() success = True except lmdb.MapFullError: txn.abort() # double the map_size curr_limit = db.info()['map_size'] new_limit = curr_limit*2 print '>>> Doubling LMDB map size to %sMB ...' % (new_limit>>20,) db.set_mapsize(new_limit) # double it ... image_datum = caffe.io.array_to_datum( transformed_image,label ) write_to_lmdb(image_db,str(itr),image_datum.SerializeToString())
总结
以上是编程之家为你收集整理的使用Python将数据写入LMDB非常慢全部内容,希望文章能够帮你解决使用Python将数据写入LMDB非常慢所遇到的程序开发问题。
如果您也喜欢它,动动您的小指点个赞吧