哪个具有1亿条记录的嵌入式数据库具有高效的C或C ++ API

时间:2009-02-08 02:57:08

标签: c database performance cross-platform

我正在寻找一种跨平台的数据库引擎,它可以处理数亿条记录的数据库而不会严重降低查询性能。它需要有一个C或C ++ API,可以轻松,快速地构建记录并解析返回的数据。

强烈建议不要将数据转换为字符串以及从字符串转换数据以使其进入数据库。存储IP地址之类的技术用户不需要或不需要这些开销。这是一个非常重要的标准,因此,如果您要参考产品,请明确说明他们如何提供这样的直接API。不希望变得粗鲁,但我可以使用谷歌 - 请假设我找到了大多数主流产品而且我在问,因为通常很难确定它们提供的直接API,而不仅仅是围绕SQL的C包装。 / p>

它不需要是一个RDBMS - 一个简单的面向ISAM记录的方法就足够了。

虽然主要需要单用户数据库,但扩展到某种共享文件或服务器操作可能会在将来使用。

如果数据库来自小公司,则非常需要访问源代码(开源或通过许可)。它不能是GPL或LGPL。

11 个答案:

答案 0 :(得分:9)

你可以C-Tree考虑​​FairCom - 告诉他们我发给你的; - )

答案 1 :(得分:8)

我是hamsterdb的作者。

东京内阁和berkeleydb应该可以正常工作。 hamsterdb肯定会起作用。它是一个普通的C API,开源,独立于平台,速度非常快,并且经过多达数百GB和数亿项的数据库测试。

如果您愿意评估并需要支持,请给我发一封邮件(hamsterdb.com上的联系表格) - 我会帮助尽我所能!

再见 克里斯托弗

答案 2 :(得分:4)

您没有提到您所使用的平台,但如果Windows只是正常,请查看Extensible Storage Engine(以前称为Jet Blue),Windows 2000及更高版本中包含的嵌入式ISAM表引擎。它用于Active Directory,Exchange和其他内部组件,针对少量大型表进行了优化。

它有一个C interface并支持二进制数据类型natively。它支持indexestransactions并使用日志来确保原子性和持久性。没有查询语言;您必须直接使用tablesindexes

ESE不喜欢通过网络打开文件,也不支持通过文件共享共享数据库。您将很难找到任何支持通过文件共享共享的数据库引擎。 Access Jet数据库引擎(AKA Jet Red,完全独立的代码库)是我所知道的唯一一个,并且它通过网络破坏文件而臭名昭着,特别是如果它们很大(> 100 MB)。

无论您使用什么引擎,您都很可能必须在自己的网络服务器进程中自己实现共享使用功能,或使用离散数据库引擎。

答案 3 :(得分:3)

对于几年后找到此页面的人,我现在正在使用LevelDB并在顶部添加一些脚手架来添加必要的多重索引。特别是,它非常适合iOS上的嵌入式数据库。我最后写了一本关于它的书! (LevelDB的入门,来自Packt,2013年末)。

答案 4 :(得分:2)

一个选项可能是Firebird。它既提供基于服务器的产品,也提供嵌入式产品。

它也是开源的,并且有大量的语言提供商。

答案 5 :(得分:2)

我相信你要找的是BerkeleyDB: http://www.oracle.com/technology/products/berkeley-db/db/index.html

别介意它是Oracle,许可证是免费的,而且它是开源的 - 唯一的问题是如果你重新发布使用BerkeleyDB的软件,你必须提供你的源代码 - 或购买许可证。

它不提供SQL支持,而是提供直接查找(通过b-tree或hash-table结构,根据您的需要更有意义)。它非常可靠,速度快,ACID,内置复制支持等等。

以下是我在上面提到的页面中引用的小引号,其中列出了一些功能:

  

数据存储

     

Berkeley DB快速存储数据   很容易没有发现的开销   其他数据库。 Berkeley DB是C   在同一进程中运行的库   作为你的应用程序,避免   进程间通信延迟   使用远程数据库服务器。共享   缓存保留最活跃的数据   内存,避免昂贵的磁盘访问。

     
      
  • 本地进程内数据存储
  •   
  • 架构中立的应用程序本机数据格式
  •   
  • 索引和顺序检索(Btree,Queue,Recno,Hash)
  •   
  • 每个应用程序有多个进程,每个进程有多个线程
  •   
  • 高度并发系统的细粒度和可配置锁定
  •   
  • 多版本并发控制(MVCC)
  •   
  • 支持二级索引
  •   
  • 内存中,磁盘上或两者上
  •   
  • 在线Btree压缩
  •   
  • 在线Btree磁盘空间回收
  •   
  • 在线废弃锁定删除
  •   
  • 关于磁盘数据加密(AES)
  •   
  • 最多可记录4GB,表格最高可达256TB
  •   

更新:刚刚浏览了这个项目并想到了你发布的问题: http://tokyocabinet.sourceforge.net/index.html。它属于LGPL,因此与您的限制不兼容,但仍然是一个有趣的项目。

答案 6 :(得分:1)

SQLite将满足这些标准,但将来最终的共享文件方案除外(实际上,如果网络文件系统正确实现文件锁定,它可能会这样做。)

答案 7 :(得分:1)

已经提到了许多好的解决方案(例如SQLite)。让我添加两个,因为你不需要SQL:

  • HamsterDB快速,简单易用,可以存储任意二进制数据。没有共享数据库的规定。
  • Glib HashTable模块似乎也非常有趣,非常有趣 很常见,所以你不会冒险进入死胡同。在另一端, 我不确定是否有简单的方法来存储数据库 磁盘,它主要用于内存中的东西

我已经对数百万个记录项目进行了测试。

答案 8 :(得分:1)

如果您熟悉Fairtree,那么您可能也熟悉Raima RDM。

几年前它开源了,然后dbstar声称他们以某种方式获得了版权。这似乎有争议。从阅读原始的Raima许可证,这似乎是不可能的。当然可以保留原始代码版本。这是相当罕见的,但我有一份档案存档。

答案 9 :(得分:0)

SQLite往往是第一个选择。它不会将数据存储为字符串,但我认为您必须构建一个SQL命令来执行插入操作,并且该命令将构建一些字符串。

如果您不需要relationDB,BerkeleyDB是一个精心设计的产品。我不知道甲骨文收取的费用以及您是否需要申请许可证。

就个人而言,我会考虑为什么你有一些要求。您是否已完成测试以验证是否需要直接插入数据库?好像你可能需要花费几个小时来编写一个包装器,它可以从你想要的任何API转换为SQL,然后查看SQLite,MySql,......是否符合你的速度要求。

答案 10 :(得分:0)

曾经有一种名为b-trieve的产品,但我不确定是否包含了源代码。我认为它已经停产。我所知道的唯一具有ISAM方向的数据库引擎是c-tree。