在 Python 中使用 lmdb 游标时没有读取数据
No data is read when using lmdb cursor in Python
我有一个 lmdb 数据库,我正在尝试读取它的内容。具有讽刺意味的是,屏幕上什么也没有打印出来。这是我为从 lmdb 读取而编写的代码片段:
import caffe
import lmdb
import numpy as np
from caffe.proto import caffe_pb2
import cv2
import sys
db_train = lmdb.open('mnist_train_lmdb')
db_train_txn = db_train.begin()
cursor = db_train_txn.cursor()
print db_train
print db_train_txn
print db_train_txn.cursor()
datum = caffe_pb2.Datum()
index = sys.argv[0]
size_train = 50000
size_test = 10000
data_train = np.zeros((size_train, 1, 28, 28))
label_train = np.zeros(size_train, dtype=int)
print 'Reading training data...'
i = -1
for key, value in cursor:
i = i + 1
if i % 1000 == 0:
print i
if i == size_train:
break
datum.ParseFromString(value)
label = datum.label
data = caffe.io.datum_to_array(datum)
data_train[i] = data
label_train[i] = label
这会打印:
<Environment object at 0x0000000009CE3990>
<Transaction object at 0x0000000009CE1810>
<Cursor object at 0x0000000009863738>
Reading training data...
Reading test data...
for 循环似乎根本没有 运行。我在这里错过了什么?
我检查了一下,这似乎是从 lmdb 读取的正常方式,我看到的所有源代码示例都有类似的方法。
自我纠正:
两种使用方式lmdb.Cursor()
for key, value in cursor:
和
while cursor.next():
原来的答案是对的,我错了。
您没有正确使用 cursor
,应该对您的代码稍作修改,例如:
... # original stuff
print 'Reading training data...'
i = -1
while cursor.next(): # Move to the next element, and
i = i + 1 # note cursor starts in an unpositioned state
if i % 1000 == 0:
print i
if i == size_train:
break
datum.ParseFromString(cursor.value())
label = datum.label
data = caffe.io.datum_to_array(datum)
data_train[i] = data
label_train[i] = label
关于lmdb python绑定的更多用法,可以参考here.
好的,看来是数据库出了问题!我使用了另一个数据库,它工作得很好。我的代码片段和@DaleSong 的建议。
我有一个 lmdb 数据库,我正在尝试读取它的内容。具有讽刺意味的是,屏幕上什么也没有打印出来。这是我为从 lmdb 读取而编写的代码片段:
import caffe
import lmdb
import numpy as np
from caffe.proto import caffe_pb2
import cv2
import sys
db_train = lmdb.open('mnist_train_lmdb')
db_train_txn = db_train.begin()
cursor = db_train_txn.cursor()
print db_train
print db_train_txn
print db_train_txn.cursor()
datum = caffe_pb2.Datum()
index = sys.argv[0]
size_train = 50000
size_test = 10000
data_train = np.zeros((size_train, 1, 28, 28))
label_train = np.zeros(size_train, dtype=int)
print 'Reading training data...'
i = -1
for key, value in cursor:
i = i + 1
if i % 1000 == 0:
print i
if i == size_train:
break
datum.ParseFromString(value)
label = datum.label
data = caffe.io.datum_to_array(datum)
data_train[i] = data
label_train[i] = label
这会打印:
<Environment object at 0x0000000009CE3990>
<Transaction object at 0x0000000009CE1810>
<Cursor object at 0x0000000009863738>
Reading training data...
Reading test data...
for 循环似乎根本没有 运行。我在这里错过了什么?
我检查了一下,这似乎是从 lmdb 读取的正常方式,我看到的所有源代码示例都有类似的方法。
自我纠正:
两种使用方式lmdb.Cursor()
for key, value in cursor:
和
while cursor.next():
原来的答案是对的,我错了。
您没有正确使用 cursor
,应该对您的代码稍作修改,例如:
... # original stuff
print 'Reading training data...'
i = -1
while cursor.next(): # Move to the next element, and
i = i + 1 # note cursor starts in an unpositioned state
if i % 1000 == 0:
print i
if i == size_train:
break
datum.ParseFromString(cursor.value())
label = datum.label
data = caffe.io.datum_to_array(datum)
data_train[i] = data
label_train[i] = label
关于lmdb python绑定的更多用法,可以参考here.
好的,看来是数据库出了问题!我使用了另一个数据库,它工作得很好。我的代码片段和@DaleSong 的建议。