我需要一个快速、可靠且内存高效的 Linux 键值数据库。我的密钥大约是 128 字节,最大值大小可以是 128K 或 256K。数据库子系统不应使用超过 1 MB 的 RAM。总数据库大小为 20G (!),但一次只能访问一小部分随机数据。如有必要,我可以将一些数据块移出数据库(移至常规文件),因此最大大小可降至 2 GB。数据库必须在系统崩溃时幸存下来,而不会丢失最近未修改的数据。我将有大约 100 倍于写入的读取。如果它可以使用块设备(没有文件系统)作为存储,那将是一个加号。我不需要客户端-服务器功能,只需要一个库。我需要 Python 绑定(但如果它们不可用,我可以实现它们)。
我应该考虑哪些解决方案,您推荐哪一个?
我知道哪些候选人可以工作:
- Tokyo Cabinet(Python绑定为pytc,另见pytc示例代码,支持hash和B+trees,事务日志文件等,bucket数组的大小在数据库创建时固定;作者必须关闭文件给别人一个机会;大量的小写入,每个文件都重新打开非常慢;Tyrant 服务器可以帮助处理大量的小写入;Tokyo Cabinet、Tokyo Tyrant 和 Berkeley DB 之间的速度比较)
- VSDB(即使在 NFS 上也是安全的,没有锁定;障碍呢?;更新非常慢,但没有 cdb 慢;最后一个版本在 2003 年)
- BerkeleyDB(提供崩溃恢复;提供事务;
bsddb
Python 模块提供绑定) - Samba 的 TDB(带有事务和 Python 绑定,一些用户经历了损坏,有时
mmap()
是整个文件,repack
操作有时会使文件大小翻倍,如果数据库大于 2G(即使在 64 位系统上),也会产生神秘的故障,集群实现(CTDB ) 也可用;在大量修改后文件变得太大;在大量哈希争用后文件变得太慢;没有内置方法来重建文件;通过锁定单个哈希桶实现非常快速的并行更新) - aodbm(仅附加,因此可以在系统崩溃中幸存下来,使用 Python 绑定)
- hamsterdb(使用 Python 绑定)
- C-tree(成熟的、多功能的高性能商业解决方案,有一个减少功能的免费版本)
- 旧的TDB(从 2001 年开始)
- bitcask(日志结构,用 Erlang 编写)
- 各种其他 DBM 实现(例如 GDBM、NDBM、QDBM、Perl 的 SDBM 或 Ruby 的;可能它们没有适当的崩溃恢复)
我不会使用这些:
- MemcacheDB(客户端-服务器,使用 BereleleyDB 作为后端)
- cdb(需要在每次写入时重新生成整个数据库)
- http://www.wildsparx.com/apbcdb/(同上)
- Redis(将整个数据库保存在内存中)
- SQLite(如果没有定期清理它会变得非常慢,请参阅 Firefox 3.0 中位置栏中的自动完成,即使 sqlite 3.1 及更高版本允许
auto_vacuum
ing;当心:小型写入事务可能非常慢;当心:如果一个繁忙的进程是做许多事务,其他进程饿死,他们永远无法获得锁) - MongoDB(过于重量级,将值视为具有内部结构的对象)
- Firebird(基于 SQL 的 RDBMS,太重了)
仅供参考,最近一篇关于Linux 杂志中键值数据库的文章。
仅供参考,较旧的软件列表
仅供参考,MemcacheDB、Redis 和 Tokyo Cabinet Tyrant 的速度比较
StackOverflow 上的相关问题: