关闭

简单LMDB用法

标签: LMDB数据库
300人阅读 评论(0) 收藏 举报
复制编译即可运行
简介:主要运用mdb_put/mdb_cursor_put  |mdb_get/mdb_cursor_get存取数据
makefile

all:	g++ -o mdb_demo mdb_demo.cpp liblmdb.a -pthread		//需要把liblmdb.a包包含进去,网上可以找到clean:	rm -rf mdb_demo core
code
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <string>

#include "lmdb.h"	//包含头文件
using namespace std;

const char *pMdbFilePath = "./MdbFile";
//Mdb Class
class Mdb
{
	public:
	Mdb()
	{
		cout << "Im Mdb Constuctor" << endl;
	}
	~Mdb()
	{
		cout << "Im Desructor" << endl;
	}
	//Create Mdb Env, Set Env Mapsize and Open Env 
	bool InitMdbEnv(const char *pMdbFile, int nSize);
	//Open Mdb File
	bool MdbOpen();
	//Open a Mdb Cursor
	bool MdbCursorOpen();
	//Put Data Into Mdb File
	bool MdbPut(char* pkey, char* pValue);
	//Get Data From Mdb File
	bool MdbGet(char* pkey, char* pData);
	//Using Cursor Get Data From Mdb File
	bool MdbCursorGet(char* pKey, char *pData);
	//Using Cursor Restore Data Into Mdb File
	bool MdbCursorPut(char* pKey, char* pData);
	//Transition Begin
	bool MdbTxnBegin();
	//Transition Commit, Current Transiton end
	bool MdbTxnCommit();
	//Transition Abort
	void MdbTxnAbort();
	//Mdb Cursor Handle Close
	void MdbCursorClose();
	//Mdb File Close
	void MdbClose();
	//Mdb Env Close
	void MdbEnvClose();
	
	
	
	private:
	MDB_env *env;
	MDB_dbi dbi;
	MDB_txn *txn;
	MDB_cursor *cursor;
	
};

void Mdb::MdbTxnAbort()
{
	mdb_txn_abort(txn);
	return ;
}
void Mdb::MdbCursorClose()
{
	mdb_cursor_close(cursor);
	return ;
}
bool Mdb::MdbCursorPut(char* pKey, char* pData)
{
	MDB_val key, data;
	key.mv_size = strlen(pKey)+1;
	key.mv_data = pKey;
	data.mv_size = strlen(pData)+1;
	data.mv_data = pData;
	if(mdb_cursor_put(cursor, &key, &data, MDB_NODUPDATA)) { cout << "MdbCursorPut Failed!!!" <<endl; return false; }
	return true;
}
bool Mdb::MdbCursorGet(char* pKey, char *pData)
{
	MDB_val key, data;
	key.mv_size = strlen(pKey)+1;
	key.mv_data = pKey;
	if(mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) { cout << "mdb_cursor_get Failed Or No Data!!!" <<endl; return 

false; }
	strcpy(pData, (char*)data.mv_data);
	strcpy(pKey, (char*)key.mv_data);
	return true;
}
bool Mdb::MdbCursorOpen()
{
	if(mdb_cursor_open(txn, dbi, &cursor)) { cout << "mdb_cursor_open Failed!!!" << endl; return false; }
	return true;
}
bool Mdb::InitMdbEnv(const char *pMdbFile, int nSize)
{
	int rc=(mdb_env_create(&env) ||
			mdb_env_set_mapsize(env, nSize) ||
			mdb_env_open(env, pMdbFile, 0, 0664));
	if(rc) { cout << "Initialize " << pMdbFile << "Mdb Fialed!!!" << endl; return false; }
	return true;
}
bool Mdb::MdbTxnBegin()
{
	if(mdb_txn_begin(env, NULL, 0, &txn)) {cout << "mdb_open failed!!!" << endl; return false;}
	return true;
}
bool Mdb::MdbOpen()
{
	if(mdb_open(txn, NULL, 0, &dbi)) {cout << "mdb_txn_beginfailed!!!" << endl; return false;}
	return true;
}
void Mdb::MdbClose()
{
	mdb_close(env, dbi);
	return ;
}
void Mdb::MdbEnvClose()
{
	mdb_env_close(env);
	return ;
}
bool Mdb::MdbPut(char* pKey, char* pData)
{
	MDB_val key, data;
	key.mv_size = strlen(pKey)+1;
	key.mv_data = pKey;
	data.mv_size = strlen(pData)+1;
	data.mv_data = pData;
	int rc = mdb_put(txn, dbi, &key, &data, MDB_NOOVERWRITE);
	if(rc == MDB_MAP_FULL) { cout << "Mdb File is full, Alert!!!" << endl; return false; }
	return true;
}
bool Mdb::MdbTxnCommit()
{
	if(mdb_txn_commit(txn)) { cout << "mdb_txn_commit failed" << endl; return false; }
	return true;
}
bool Mdb::MdbGet(char* pKey, char* pData)
{
	MDB_val key, data;
	key.mv_size = strlen(pKey)+1;
	key.mv_data = pKey;
	if(mdb_get(txn, dbi, &key, &data)) { cout << "mdb_get failed!!!" << endl; return false; }
	strcpy(pData, (char*)data.mv_data);
	return true;
}
int main(int argc,char *argv[])
{
	Mdb mdb; 	//Create a Mdb Objiect
	
	mdb.InitMdbEnv(pMdbFilePath, 200*1024*1024);//Initialize Mdb Env and Specifc Mdb File Max Size
	mdb.MdbOpen();		//Open a Mdb File
	
	//************mdb_put Restore Data*******************
	char cKey[10]="";
	char cValue[100]="Im value";
	mdb.MdbTxnBegin();	//Begin a Transition
	for(int i=0; i<100; i++) {
		sprintf(cKey, "%06d", i);
		mdb.MdbPut(cKey, cValue);	//mdb_put Restore Data
	}
	mdb.MdbTxnCommit();		//Commit Transition
	//*****************************************************
	
	//************mdb_get Get items Form Database**********
	char cKey1[]="000002";
	char cValue1[100]="";
	mdb.MdbTxnBegin();
	mdb.MdbGet(cKey1, cValue1);
	mdb.MdbTxnCommit();
	cout << "Key:000002:" << cValue1 << endl;
	//*****************************************************
	
	//************mdb_cursor_put Using Cursor Restore Data*******
	char cKey2[10]="";
	char cValue2[100]="I m Cursor Values";
	mdb.MdbTxnBegin();
	mdb.MdbCursorOpen();
	for(int i=101; i<201; i++) {
		sprintf(cKey2, "%06d", i);
		mdb.MdbCursorPut(cKey2, cValue2);
	}
	mdb.MdbCursorClose();
	mdb.MdbTxnCommit();
	//***********************************************************
	
	//***********mdb_cursor_get Using Cursor Get Data************
	mdb.MdbTxnBegin();
	mdb.MdbCursorOpen();
	char cKey3[10]="";
	char cValue3[100]="";
	while (mdb.MdbCursorGet(cKey3, cValue3)) {
		cout << "Key: " << cKey3 << "    data: " << cValue3 << endl;
	}
	mdb.MdbCursorClose();
	mdb.MdbTxnAbort();
	//***********************************************************
	
	mdb.MdbClose();	//Close Mdb File
	mdb.MdbEnvClose();	//Close Mdb Env
	return 0;
}

0
0
查看评论

LMDB使用说明

http://rayz0620.github.io/2015/05/25/lmdb_in_caffe/ 官方的extract_feature.bin很好用,但是输出的特征是放在LMDB里的。以前嫌LMDB麻烦,一直都图方便直接用ImageDataLayer来读原始图像。这次绕不过去了,就顺...
  • jyl1999xxxx
  • jyl1999xxxx
  • 2016-12-30 14:39
  • 7102

Leveldb/lmdb/comdb 各种存储引擎的个人见解

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的...
  • wuhuaiyu
  • wuhuaiyu
  • 2015-06-27 19:38
  • 3211

Caffe代码导读(2):LMDB简介

闪电般的内存映射型数据库管理(LMDB) 简介 LMDB是基于二叉树的数据库管理库,建模基于伯克利数据库的应用程序接口,但大幅精简了。整个数据库都是内存映射型的,所有数据获取返回数据都是直接从映射的内存中返回,所以获取数据时没有malloc或memcpy发生。基于此,该库仍是非常简单的,因为它不...
  • kkk584520
  • kkk584520
  • 2014-11-12 23:55
  • 7414

Python lmdb使用

1. 准备LMDB和SQLite/MySQL等关系型数据库不同,属于key-value数据库(把LMDB想成dict会比较容易理解),键key与值value都是字符串。安装:pip install lmdb使用时import lmdb。2. 操作流程概况地讲,操作LMDB的流程是: 通过env = ...
  • u010472607
  • u010472607
  • 2017-08-07 18:59
  • 480

Caffe中LMDB的使用

http://rayz0620.github.io/2015/05/25/lmdb_in_caffe/ 最近做实验,要用Caffe提取CNN特征。官方的extract_feature.bin很好用,但是输出的特征是放在LMDB里的。以前嫌LMDB麻烦,一直都图方便直接用ImageDataL...
  • haluoluo211
  • haluoluo211
  • 2017-01-14 16:40
  • 4567

文件格式之lmdb

使用caffe对数据进行处理时,需要将图片转化为lmdb格式的。 求助百度百科,无词条,求助wikipedia,成功,地址. LMDB示例文件为 它包含一个数据文件和一个锁文件。python 操作参考教程1,教程2和教程3 python module 为lmdb 直接通过pip进行安装...
  • u011394059
  • u011394059
  • 2017-07-03 11:13
  • 604

caffe 数据库LMDB的读写

读写的图片都是灰度图,rgb图类似 一、读数据(图片的channel是2,其实是两张图片): import sys sys.path.insert(0,"../../python") import numpy as np import lmdb import caffe imp...
  • u010668907
  • u010668907
  • 2016-07-05 20:50
  • 8210

lmdb源码阅读

官网:http://symas.com/mdb/ 源码:openldap项目的一部分 进行项目进行comdb(公司内部)leveldb、lmdb各种存储的调研。遂有此文。 comdb  内存索引,日志追加型存储  在ssd机器上,快速访问内存。    ...
  • wuhuaiyu
  • wuhuaiyu
  • 2015-04-09 14:44
  • 927

Python lmdb

最近从 leveldb 转到 lmdb, 需要用python实现。观察caffe里,db里 保存的都是datum format, 所以datum就变成了中转中心。用python 调用levedb的函数在这里 这里是 lmdb documentswritedb_img = lmdb.Environm...
  • ayst123
  • ayst123
  • 2015-03-05 09:20
  • 14827

caffe的lmdb

要求系统已经安装了caffe,相关的安装可以参考 链接 一,LMDB的概况 全称是Lightning Memory-Mapped Database, 是一种闪电型的内存映射数据库,它的文件结构比较简单,就是一个文件夹,里面有一个数据文件和一个锁文件,数据随意复制,随意传输,访问简单,不需要运...
  • sysushui
  • sysushui
  • 2017-01-17 18:40
  • 1317
    个人资料
    • 访问:14274次
    • 积分:252
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:21篇
    • 译文:0篇
    • 评论:0条
    文章分类