Google Leveldb在Linux下的編譯及在C++中的應(yīng)用
本文我們主要介紹了Linux下編譯Leveldb數(shù)據(jù)庫的過程以及Leveldb在C++中的操作示例簡介,接下來就讓我們來一起了解一下這一過程。
1:簡介
Leveldb是一個(gè)google實(shí)現(xiàn)的非常高效的kv數(shù)據(jù)庫,可按照字符串鍵值順序映射進(jìn)行存貯。目前的版本1.2能夠支持billion級別的數(shù)據(jù)量了。 在這個(gè)數(shù)量級別下還有著非常高的性能。
Leveldb是一個(gè)C++庫,可用于很多情況。比如用于一個(gè)網(wǎng)頁瀏覽器存儲最近存取網(wǎng)頁的緩存,或用于操作系統(tǒng)存儲安裝包列表,或用于應(yīng)用存儲用戶的設(shè)置參數(shù)。其實(shí)新版本的Chrome瀏覽器里部署的IndexedDB HTML5 API就是基于LevelDB打造的。Google自己的數(shù)據(jù)庫Bigtable掌管著數(shù)百萬數(shù)據(jù)表也是用LevelDB的。
2:編譯源代碼
我用的版本為Release 1.2 2011-05-16,這個(gè)需要用SVN下載,過程就不多說了。
2.1 解壓縮文件,我的路徑是/home/lyc/leveldb/Leveldb。
2.2 進(jìn)入解壓縮后的路徑,cd /home/lyc/leveldb/Leveldb。
2.3 編譯,這個(gè)很簡單一個(gè)命令makefile就行了,注意這個(gè)編譯需要g++的支持。
2.4 編譯后在/home/lyc/leveldb/Leveldb路徑下會出現(xiàn)一個(gè)庫文件libleveldb.a,這個(gè)可以用在自己的項(xiàng)目中。
3:leveldb性能測試
默認(rèn)的編譯makefile命令是不會生成測試程序的,如果要生成這些輔助的程序,可以用命令makefile test。
結(jié)果在/home/lyc/leveldb/Leveldb路徑下會產(chǎn)生可執(zhí)行文件db_bench,arena_test,db_test等測試程序。這個(gè)就不解少了,我的目標(biāo)的是在自己的程序中使用leveldb,所以重點(diǎn)在使用庫文件libleveldb.a上。
4:leveldb頭文件準(zhǔn)備
頭文件的問題花了很多時(shí)間來解決,其實(shí)很簡單,到/home/lyc/leveldb/Leveldb路徑下(這個(gè)具體要根據(jù)自己的文件路徑),用命令 cp -r include/leveldb /usr/local/include。把./include/leveldb文件夾的內(nèi)容都拷到/usr/local/include路徑下。
注意要切還到root用戶,要不沒有執(zhí)行的權(quán)限。
5:示例程序
把libleveldb.a、db.h拷到本程序的同一路徑下。
編譯命令為: g++ -o sa Main.cpp libleveldb.a -lpthread
執(zhí)行:
[lyc@Fedora test]$ ./sa
結(jié)果:
Open db OK
liyc7711@gamil.com
源碼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 = "liyc7711@gamil.com";
- 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);/*根據(jù)key返回對應(yīng)的value值*/
- cout<<value<<std::endl;
- delete db;/*刪除數(shù)據(jù)庫*/
- return 0;
- }
6:注意事項(xiàng)
6.1 編譯中加上庫文件的路徑(libleveldb.a)和線程庫標(biāo)志(-lpthread),執(zhí)行后在當(dāng)前文件產(chǎn)生一個(gè)文件夾testdb保存了插入的數(shù)據(jù)。
6.2 Leveldb用于一些單間的數(shù)據(jù)比如名稱-值對,并且數(shù)據(jù)量遠(yuǎn)大于內(nèi)存并且需要***保存的情況下。很適合大規(guī)模的語言模型文件存貯。
6.3 插入的數(shù)據(jù)為兩個(gè)字符串對一個(gè)為key,另外一個(gè)為value,查詢時(shí)可以根據(jù)key取得value的值,相反不可以。
關(guān)于在Linux下編譯Google Leveldb數(shù)據(jù)庫及在C++中操作示例就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
【編輯推薦】






