1

我正在开发一种生物学软件,该软件会生成数百万个长度通常大于 30 个字符的字符串(由核苷酸碱基组成,AGCT)。写成C。

我需要一个数据库以足够快的速度将这些数据存储在磁盘上,以免造成整个软件变慢的瓶颈,并且不会消耗过多的 RAM。此外,我需要它在我的应用程序中完全链接。我不想强迫我的用户安装 SQL 服务器或类似的东西。

我已经尝试过 hamsterDB、SQLite、Kyoto Cabinet 和 MapDB,但都没有成功。问题是我需要至少以大约 50k 操作/秒的速度从数据库中插入或更新数据。通过一些优化,我让 SQLite 变得更快。它达到 18k 操作/秒(它使用同步关闭、journal_mode 关闭、事务、ignore_check_constraints 开启、cache_size 为 500.000 和预编译语句)。

每个序列被分类为 A 或 B,我需要知道每种序列有多少。现在我正在使用序列作为键,并为 A 类型添加一个计数器,为 B 类型添加另一个计数器。在 SQLite 数据库上,我使用如下列和命令:

INSERT OR REPLACE INTO events (main_seq,qnt_A,qnt_B) VALUES (@SEQ,COALESCE((SELECT qnt_A FROM events WHERE main_seq=@SEQ)+1,1),(SELECT qnt_B FROM events WHERE main_seq=@SEQ))

这比简单的 INSERT INTO 慢,但如果 seq 已经存在于 DB 上,我只需要增加其中一列。

使用京都内阁我得到了非常高的速度,但它只支持字符串记录,我需要添加和更新整数来计算我有多少 A 和 B。

有谁知道另一个可以满足我对写入速度和记录灵活性的需求的好数据库?

4

2 回答 2

3

这份 BerkeleyDB 白皮书说,理论上的限制是每秒 70,000 个事务。实际性能会低得多,并且它们的理论限制是基于一些假设,这些假设不适用于您的情况。但他们仍然声称 BerkeleyDB 比 SQLite 快得多。

如果您认为单个 BDB 写入器测量的吞吐量约为 700 TPS,那么理论上的限制将是 70,000 TPS,同时有 100 个非冲突的并发执行线程。

于 2013-02-26T20:01:03.347 回答
3

以下基准

查找OpenLDAP MDB

以适应提交的案例,特别是对于大型随机写入

数据库。13,215个条目/秒
京都 TreeDB 。5,860 个条目/秒
LevelDB 。3,138 个条目/秒
SQLite3 。2,068 个条目/秒
BerkeleyDB 。1,952 个条目/秒

于 2014-06-14T11:00:04.547 回答