在Linux下編譯Google leveldb數據庫及在C++中操作示例

http://blog.csdn.net/lx111000lx0/article/details/8353381

from:http://blog.csdn.net/harry_lyc/article/details/6667399

1:簡介

       Leveldb是一個google實現的非常高效的kv數據庫,可按照字符串鍵值順序映射進行存貯。目前的版本1.2能夠支持billion級別的數據量了。 在這個數量級別下還有着非常高的性能。

        Leveldb是一個C++庫,可用於很多情況。比如用於一個網頁瀏覽器存儲最近存取網頁的緩存,或用於操作系統存儲安裝包列表,或用於應用存儲用戶的設置參數。其實新版本的Chrome瀏覽器裏部署的IndexedDB HTML5 API就是基於LevelDB打造的。Google自己的數據庫Bigtable掌管着數百萬數據表也是用LevelDB的。

         今天在Linux(Fedra14)下編譯了一下,感覺不錯。中間遇到了很多問題,記錄下來。作爲學習之用。

         在這裏我想發泄一下鬱悶之情。我對學過Linux下的編程,但是不是很深入,大部分時間時自己摸索的,周圍沒有可以交流的人,再說周圍的大部分在搞javaC#、.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++的支持

      2.4 編譯後在/home/lyc/leveldb/Leveldb路徑下會出現一個庫文件libleveldb.a,這個可以用在自己的項目中

3leveldb性能測試

         默認的編譯makefile命令是不會生成測試程序的,如果要生成這些輔助的程序,可以用命令makefile test

         結果在/home/lyc/leveldb/Leveldb路徑下會產生可執行文件db_bencharena_testdb_test等測試程序。這個就不解少了,我的目標的是在自己的程序中使用leveldb,所以重點在使用庫文件libleveldb.a上。

4leveldb頭文件準備

        頭文件的問題花了很多時間來解決,其實很簡單,到/home/lyc/leveldb/Leveldb路徑下(這個具體要根據自己的文件路徑),用命令 cp -r include/leveldb   /usr/local/include。把./include/leveldb文件夾的內容都拷到/usr/local/include路徑下。

       注意要切還到root用戶,要不沒有執行的權限。

5:示例程序

libleveldb.adb.h拷到本程序的同一路徑下。

編譯命令爲: g++ -o sa Main.cpp libleveldb.a -lpthread

執行:

[lyc@Fedora test]$ ./sa

結果:

Open db OK

[email protected]

源碼Main.cpp:

  1. #include <assert.h>  
  2. #include <iostream>  
  3. #include "db.h"  
  4.   
  5. using namespace std;  
  6.   
  7. int main(int argc,char * argv[])  
  8. {  
  9.     leveldb::DB* db;  
  10.     leveldb::Options options;  
  11.     options.create_if_missing = true;  
  12.     std::string dbpath = "testdb";  
  13.     leveldb::Status status = leveldb::DB::Open(options, dbpath, &db);  
  14.     assert(status.ok());  
  15.     std::string key1 = "lyc";  
  16.     std::string key2 = "[email protected]";  
  17.     cout<<"Open db OK"<<std::endl;  
  18.       
  19.     std::string value;  
  20.     leveldb::Status s ;  
  21.     s = db->Put(leveldb::WriteOptions(), key1, key2);/*key1和key2作爲一對key-value對插入*/  
  22.     s = db->Get(leveldb::ReadOptions(), key1, &value);/*根據key返回對應的value值*/  
  23.       
  24.     cout<<value<<std::endl;  
  25.     delete db;/*刪除數據庫*/  
  26.   
  27.     return 0;  
  28. }  

6:注意事項

        6.1 編譯中加上庫文件的路徑(libleveldb.a)和線程庫標誌(-lpthread),執行後在當前文件產生一個文件夾testdb保存了插入的數據。

        6.2 leveldb用於一些單間的數據比如名稱-值對,並且數據量遠大於內存並且需要永久保存的情況下。很適合大規模的語言模型文件存貯。

       6.3 插入的數據爲兩個字符串對一個爲key,另外一個爲value,查詢時可以根據key取得value的值,相反不可以。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章