2012-03-21 116 views
3

我正在尋找用於存儲二進制數據的輕量級,可靠且快速的鍵/值數據庫。簡單沒有服務器。大多數流行的鍵/值數據庫(如CDB和BerkeleyDB)本身不會存儲BLOB。什麼可以是我錯過的最佳選擇?用於存儲二進制數據的鍵/值數據庫

我目前的選擇是SQLite,但它太高級了,我的簡單用法。

回答

7

正如先前指出,BerkeleyDB的不支持不透明值和鍵,但我會提出一個更好的選擇:性LevelDB。

性LevelDB:

谷歌是你的朋友:),以至於他們甚至爲您提供一個嵌入式數據庫:A fast and lightweight key/value database library by Google.

特點:

  • 鍵和值是任意的字節數組。
  • 數據存儲按鍵排序。
  • 調用者可以提供自定義比較函數來覆蓋排序順序。
  • 基本操作有Put(key,value),Get(key),Delete(key)。
  • 可以在一個原子批次中進行多項更改。
  • 用戶可以創建瞬態快照以獲得數據的一致視圖。
  • 數據支持向前和向後迭代。
  • 使用Snappy壓縮庫自動壓縮數據。
  • 通過虛擬接口中繼外部活動(文件系統操作等),以便用戶可以自定義操作系統交互。
  • 有關如何使用庫的詳細文檔包含在源代碼中。
0

你正在運行哪個操作系統?對於Windows,您可能想要查看ESE,這是一個非常強大的存儲引擎,作爲操作系統的一部分提供。它支持Active Directory,Exchange,DNS和其他一些微軟服務器產品,並被許多第三方產品使用(RavenDB是一個很好的例子)。

+0

我在Linux(Ubuntu的)。 – Googlebot 2012-03-21 11:22:19

+1

您是否認爲簡單的「文件系統作爲db」選項?文件內容=值... – Addys 2012-03-21 13:01:47

+1

@Addys:我很喜歡這個系統,你應該把它作爲正確的答案 – hroptatyr 2012-03-21 13:22:02

3

是什麼讓你覺得BerkDB無法存儲二進制數據?從他們的文檔:

鍵和內容參數是基準typedef描述的對象。數據指定由dptr指向的dsize字節的字符串。任意二進制數據以及普通文本字符串都是允許的。

而且看到自己的examples

money = 122.45; 
key.data = &money; 
key.size = sizeof(float); 
... 
ret = my_database->put(my_database, NULL, &key, &data, DB_NOOVERWRITE); 
1

如果你不需要「多個寫入器進程」(只有多個讀取器工作),想要一些小東西,想要幾乎每一個linux上都有的東西,你可以看看gdbm,它是像伯克利分貝,但更簡單。它也可能不那麼快。

在幾乎相同的領域,像tokyocabinet,qdbm和已經提到的leveldb。

Berkeley db和sqlite都領先於那些,因爲它們支持多個編寫者。 berkeley db有時是版本化的毀滅者。

gdbm的主要職業:它已經在每一個linux上,沒有版本問題,很小。

0

使用sqlite現在可以直接使用自2014-06以來可用的新函數readfile(X)和writefile(X,Y)。例如保存一個blob從文件數據庫,並再次將其解壓縮

 CREATE TABLE images(name TEXT, type TEXT, img BLOB); 
    INSERT INTO images(name,type,img) VALUES('icon','jpeg',readfile('icon.jpg')); 
    SELECT writefile('icon-copy2.jpg',img) FROM images WHERE name='icon'; 

看到https://www.sqlite.org/cli.html 「文件I/O功能」