您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

使用Python将数据写入LMDB非常慢

5b51 2022/1/14 8:23:27 python 字数 2959 阅读 615 来源 www.jb51.cc/python

用 Caffe创建训练数据集我都尝试使用HDF5和LMDB.但是,创建LMDB非常慢,甚至比HDF5慢.我想写约20,000张图片. 我做错了什么吗?有什么我不知道的吗? 这是我创建LMDB的代码: DB_KEY_FORMAT = "{:0>10d}" db = lmdb.open(path, map_size=int(1e12)) curr_idx = 0 commit_size

概述

我做错了什么吗?有什么我不知道的吗?

这是我创建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非常慢所遇到的程序开发问题。


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶