(转载+整理)Leveldb安装及例子

 1:简介

Leveldb是一个google实现的非常高效的kv数据库,可按照字符串键值顺序映射进行存贮。目前的版本1.2能够支持billion级别的数据量了。 在这个数量级别下还有着非常高的性能。

Leveldb是一个C++库,可用于很多情况。比如用于一个网页浏览器存储最近存取网页的缓存,或用于操作系统存储安装包列表,或用于应用存储用户的设置参数。其实新版本的Chrome浏览器里部署的IndexedDB HTML5 API就是基于LevelDB打造的。Google自己的数据库Bigtable掌管着数百万数据表也是用LevelDB的。

今天在Linux(Fedra14)下编译了一下,感觉不错。中间遇到了很多问题,记录下来。作为学习之用。

在这里我想发泄一下郁闷之情。我对学过Linux下的编程,但是不是很深入,大部分时间时自己摸索的,周围没有可以交流的人,再说周围的大部分在搞java、C#、.net没人在研究c\c++尤其是Linux下的。有些研究生毕业了还不知道什么是ubuntu。我以一直喜欢技术特别是Linux的,不管怎样算是一种追求吧。自己摸索之路是很坎坷的,深知一个人探索的困难,所以遇到问题会自己写下来发成博客,对自己是一种学习,也希望别的有共同兴趣的人有所帮助,如果能让没有一点基础的人们能看懂,并且根据示例自己操作成功,也算是一件很有成就感的事。

2:编译源代码

我用的版本为Release 1.2 2011-05-16,这个需要用SVN下载,过程就不多说了。

2.1 解压缩文件,我的路径是/home/lyc/leveldb/Leveldb

2.2 进入解压缩后的路径,cd /home/lyc/leveldb/Leveldb

2.3 编译,这个很简单一个命令makefile就行了,注意这个编译需要g++的支持

放到linux系统中解压并编译,其实编译leveldb很简单,解压下载包之后进入目录直接执行make即可。编译完成之后会在当前目录生成几个文件:

libleveldb.a libleveldb.so libleveldb.so.1 libleveldb.so.1.13(我当前下载的是1.13.0版),其中libleveldb.so.1,libleveldb.so都是libleveldb.so.1.13的软连

2.4 编译后在/home/lyc/leveldb/Leveldb路径下会出现一个库文件libleveldb.a,这个可以用在自己的项目中

3leveldb性能测试

默认的编译makefile命令是不会生成测试程序的,如果要生成这些辅助的程序,可以用命令makefile test

结果在/home/lyc/leveldb/Leveldb路径下会产生可执行文件db_bench,arena_test,db_test等测试程序。这个就不解少了,我的目标的是在自己的程序中使用leveldb,所以重点在使用库文件libleveldb.a上。

源码包中自带有几个性能测试程序,一个是leveldb自身的测试程序:db_bench,还有两个分别是db_bench_sqlite3、db_bench_tree_db,分别编译之make db_bench  make db_bench_sqlite3  mke db_bench_tree_db,后面两个由于依赖关系不一定能够编译通过,具体问题需要具体解决。

4leveldb头文件准备

头文件的问题花了很多时间来解决,其实很简单,到/home/lyc/leveldb/Leveldb路径下(这个具体要根据自己的文件路径),用命令 cp -r include/leveldb   /usr/local/include。把./include/leveldb文件夹的内容都拷到/usr/local/include路径下。

注意要切还到root用户,要不没有执行的权限。

将include下的leveldb目录拷贝到/usr/include/下:cp -r include/leveldb /usr/include/

5:示例程序

把libleveldb.a、db.h拷到本程序的同一路径下。

编译命令为: g++ -o sa Main.cpp libleveldb.a -lpthread

执行:

[[email protected] test]$ ./sa

结果:

Open db OK

[email protected]

源码Main.cpp:

#include <assert.h>

#include <iostream>

#include "db.h"

using namespace std;

int main(int argc,char * argv[])

{

leveldb::DB* db;

leveldb::Options options;

options.create_if_missing = true;

std::string dbpath = "testdb";

leveldb::Status status = leveldb::DB::Open(options, dbpath, &db);

assert(status.ok());

std::string key1 = "lyc";

std::string key2 = "[email protected]";

cout<<"Open db OK"<<std::endl;

std::string value;

leveldb::Status s ;

s = db->Put(leveldb::WriteOptions(), key1, key2);/*key1和key2作为一对key-value对插入*/

s = db->Get(leveldb::ReadOptions(), key1, &value);/*根据key返回对应的value值*/

cout<<value<<std::endl;

delete db;/*删除数据库*/

return 0;

}

6:注意事项

6.1 编译中加上库文件的路径(libleveldb.a)和线程库标志(-lpthread),执行后在当前文件产生一个文件夹testdb保存了插入的数据。

6.2 leveldb用于一些单间的数据比如名称-值对,并且数据量远大于内存并且需要永久保存的情况下。很适合大规模的语言模型文件存贮。

6.3 插入的数据为两个字符串对一个为key,另外一个为value,查询时可以根据key取得value的值,相反不可以。

 简单测试用例

//
main.cpp

#include
<assert>

#include
<iostream>

#include
<leveldb/db.h>

int
main (int argc,char * argv[])

{

leveldb::DB* db;

leveldb::Options options;

options.create_if_missing = true;

std::string dbpath =
"testdb";

leveldb::Status status =
leveldb::DB::Open (options, dbpath, &db);

assert (status.ok ());

std::string key = "test";

std::string val =
"test_value";

s = db->Put (leveldb::WriteOptions
(), key, val);

val.clear ();

s = db->Get (leveldb::ReadOptions
(), key, &val);

std::cout << key << ":
" << val << std::endl;

}

编译:将之前编译好的libleveldb.a拷贝到于以上代码同一目录中然后g++ -o leveldbtest main.cpp libleveldb.a –lpthread

#include <iostream>
#include "leveldb/db.h"

using namespace std;
using namespace leveldb;

int main() {
    DB *db ;
    Options op;
    op.create_if_missing = true;
    Status s = DB::Open(op,"/tmp/testdb",&db);

if(s.ok()){
        cout << "create successfully" << endl;
        s = db->Put(WriteOptions(),"abcd","1234");
        if(s.ok()){
            cout << "put successfully" << endl;
            string value;
            s = db->Get(ReadOptions(),"abcd",&value);
            if(s.ok()){
                cout << "get successfully,value:" << value << endl;
            }
            else{
                cout << "get failed" << endl;
            }
        }
        else{
            cout << "put failed" << endl;
        }
    }
    else{
        cout << "create failed" << endl;
    }
    delete db;
    return 0;
}

给你补充下: 
编译命令为g++ ldbtest.cpp -o ldbtest -L. -I./include
-lpthread -lleveldb

(工作目录就是leveldb目录中) include下面是leveldb的头文件,-L 搜索library 为了libleveldb.a能够被调用。

另外,编译的时候 可以将Makefile中说的snappy 压缩 也带上,还有谷歌perfecttools ,这个可选。压缩还是有必要的吧。

时间: 2024-08-30 02:56:51

(转载+整理)Leveldb安装及例子的相关文章

Andriod 关于操作栏 ActionBar 的设计原则【转载+整理】

原文地址 本文内容 操作栏目的 基本布局 适应旋转和不同的屏幕尺寸 副操作栏的布局 操作栏按钮 上下文操作栏 操作栏清单 设计原则就是为你在编写 Android APP 时,尤其是如何安排操作按钮的位置,以及顺序等等,能大幅度提供用户体验的,提供的一个指导思想.值得时不时地回忆一下,这些指导原则都是经过长时间实践得到的结论.一个 APP 好不好,在你最开始时,点击一遍所有的菜单和按钮,就清楚了.在使用过大量 Android APP 后,你会发现,遵循了下面这些原则的 APP 将会有更好的用户体验

Linux(Ubuntu) Mysql的安装配置例子以及常用命令

1.安装配置例子 有空再写 2.注意事项 (1)启动mysql 在/etc/mysql 目录下 service mysql start  新版本是(service mysqld start  ) (2)暂停 mysql service mysql stop 新版本是(service mysqld stop ) (3)重启 mysql service mysql restart新版本是(service mysqld restart) (4)客户端连不上linux的mysql数据库 解决:修改一个文

撼动 IT 界的十大编程语言【转载+整理】

提这些的目的是要保持关注最新的技术.如果你是一个程序员,想要探究未来技术,那这篇文章是你的必读之选.这里列出了10种编程语言,它们可能会改变IT界的工作方式. 下面这些语言都有其实际的需求,举例来说,Web 开发,已目前的 Web 开发方式,实在是太麻烦了.涉及到 HTML.CSS.Javascript 以及 Ajax,再就是一个服务器语言,Java 或 C#,或是 PHP,这实在太繁琐了,有没有用一个语言,将这些所有问题都解决呢~ Dart语言 这种网络编程语言由谷歌创造,帮助开发者克服 Ja

[转载整理]计算机视觉及机器学习牛人和资料

Author: JW. ZHOU 2014/6/13 Paper毕竟是死的,写Paper的人才是活的,那么现在就研究一下CV圈的格局,按师承关系,总结成一个树形结构[参考1]. David Marr ----->Shimon Ullman (Weizmann) ----->Eric Grimson (MIT) ----->Daniel Huttenlocher (Cornell) ----->Pedro Felzenszwalb (Chicago) Thomas Binford (

【转载+整理】Android中TouchEvent事件分析

原文地址:http://mobile.51cto.com/abased-374715.htm 一.知识回顾 一个最简单的屏幕触摸动作触发了一系列Touch事件:ACTION_DOWN->ACTION_MOVE->ACTION_MOVE->ACTION_MOVE...->ACTION_MOVE->ACTION_UP 二.问题提出 当屏幕中包含一个ViewGroup,而这个ViewGroup又包含一个子view,这个时候android系统如何处理Touch事件呢?到底是 View

关于ps安装遇到的问题解决(转载整理)

1.无法卸载adobe creative cloud(原链接点击这里) 解决办法: 如果您不再需要某个应用程序,则必须使用 Adobe Creative Cloud 桌面应用程序卸载该应用程序. 官方卸载软件点击下载 2.下载完开始安装,点击Setup.exe,出现以下情况或者类似无法安装弹窗(原链接点击这里) 解决办法: ① 在"开始"--"运行"中输入"regedit"打开注册表② 依次展开HKEY_LOCAL_MACHINE\SYSTEM\

win7环境下安装运行gotour【转载整理】

最近尝试学习golang,在某个网站(真忘了)上发现gotour是一款灰常叼的教程&指南,之后搜索发现有前辈给出了本地安装离线gotour的方法,但实际安装过程中发现一些问题: 1.通过go get bitbucket.org/mikespook/go-tour-zh/gotour命令安装时报错,提示missing Mercurial command,原来是先需要安装Mercurial: 2.顺利用以上命令安装成功后,原贴说直接运行gotour命令即可通过http://127.0.0.1:399

转载:Hadoop安装教程_单机/伪分布式配置_Hadoop2.6.0/Ubuntu14.04

原文 http://www.powerxing.com/install-hadoop/ 当开始着手实践 Hadoop 时,安装 Hadoop 往往会成为新手的一道门槛.尽管安装其实很简单,书上有写到,官方网站也有 Hadoop 安装配置教程,但由于对 Linux 环境不熟悉,书上跟官网上简略的安装步骤新手往往 Hold 不住.加上网上不少教程也甚是坑,导致新手折腾老几天愣是没装好,很是打击学习热情. 本教程适合于原生 Hadoop 2,包括 Hadoop 2.6.0, Hadoop 2.7.1

分布式事务解决方案(转载+整理)

导读:以下资料均来自网络,本人负责整理 1.使用消息队列来避免分布式事务 比如在北京很有名的姚记炒肝点了炒肝并付了钱后,他们并不会直接把你点的炒肝给你,而是给你一张小票,然后让你拿着小票到出货区排队去取.为什么他们要将付钱和取货两个动作分开呢?原因很多,其中一个很重要的原因是为了使他们接待能力增强(并发量更高). 还是回到我们的问题,只要这张小票在,你最终是能拿到炒肝的.同理转账服务也是如此,当支付宝账户扣除1万后,我们只要生成一个凭证(消息)即可,这个凭证(消息)上写着“让余额宝账户增加 1万