以正确的方式创建lmdb文件

时间:2016-09-18 11:24:26

标签: python database neural-network caffe lmdb

我正在尝试创建一个包含所有数据库映像的lmdb文件(为了训练CNN)。

这是我的“测试代码”,是我从here获取的:

import numpy as np
import lmdb
import caffe
import cv2
import glob

N = 18

# Let's pretend this is interesting data
X = np.zeros((N, 1, 32, 32), dtype=np.uint8)
y = np.zeros(N, dtype=np.int64)

# We need to prepare the database for the size. We'll set it 10 times
# greater than what we theoretically need. There is little drawback to
# setting this too big. If you still run into problem after raising
# this, you might want to try saving fewer entries in a single
# transaction.
map_size = X.nbytes * 10


train_data = [img for img in glob.glob("/home/roishik/Desktop/Thesis/Code/cafe_cnn/third/code/train_images/*png")]
for i , img_path in enumerate(train_data):
    img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
    X[i]=img
    y[i]=i%2


env = lmdb.open('train', map_size=map_size)
print X
print y
with env.begin(write=True) as txn:
    # txn is a Transaction object
    for i in range(N):
        datum = caffe.proto.caffe_pb2.Datum()
        datum.channels = X.shape[1]
        datum.height = X.shape[2]
        datum.width = X.shape[3]
        datum.data = X[i].tobytes()  # or .tostring() if numpy < 1.9
        print 'a ' + str(X[i])        
        datum.label = int(y[i])
        print 'b ' + str(datum.label)
        str_id = '{:08}'.format(i)                

        txn.put(str_id.encode('ascii'), datum.SerializeToString())

如您所见,我指定了随机二进制标签(0或1,分别为偶数或奇数)。在我创建更大的lmdb文件之前,我想确保我以正确的方式做到这一点。

创建此文件后,我想'查看文件'并检查它是否正常,但我不能。使用python,Access 2016和.mdb阅读器(linux ubunto软件)无法正常打开文件。我的问题是:

  1. 我不明白这段代码是做什么的。什么是str_id?什么是X[i].tobytes?最后一行做了什么?

  2. 运行代码后,我得到了2个文件:'data.mdb'和'key.mdb'。这两个是什么?也许那两个文件是我无法打开数据库的原因?

  3. the two output files

    非常感谢,非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

str_id是LMDB中使用的数据集的内部名称(例如,一个JPG图像)。它来自路径和序列号 i

tobytes ...在这里,让我search为你。整个过程在循环结束时将数据集(datum)转换为LMDB格式,然后将该二进制表示直接复制到文件中。 tobytes SerializeToString 是按原样传输位模式的关键方法。

data.mdb 是一个相对庞大的数据文件,以易于恢复的形式包含所有这些位序列。换句话说,它不会阻止您的数据库访问,因为 是数据库。

lock.mdb 是记录级锁定文件:在任何读取或写入期间,每个数据都会被适当锁定(完全或只读)。

这应该解释一些悬而未决的问题。 锁定不会阻止打开数据库;它仅在访问操作期间运行。检查您的文件权限。检查您的用户身份:LMDB创建是否可以作为 root 运行,而不是给您读取权限?您是否尝试使用简单的编辑器以只读方式打开它,例如 vi wordpad

我希望这会让你走向解决方案。

答案 1 :(得分:0)

您可以使用mdb_dump工具检查数据库的内容。