2012-03-21 120 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功能”