在磁盘上存储大量不同大小的对象

时间:2008-11-04 04:30:31

标签: data-structures storage

我需要开发一个用于存储大量(10到100个)对象的系统。每个对象都是类似电子邮件的 - 有一个主文本体和几个有限大小的辅助文本字段。一个主体将从几个字节到几KB大小。

每个项目都有一个标识它的唯一ID(可能是GUID)。

只有在添加对象时才会写入商店。它会经常阅读。删除将很少见。数据几乎都是人类可读的文本,因此很容易压缩。

允许我发出I / O并管理内存和缓存的系统将是理想的选择。

我要将索引保留在内存中,使用它将索引映射到对象的单个(和主)键。一旦我有了密钥,我就会从磁盘或缓存中加载它。

数据管理系统需要成为我应用程序的一部分 - 我不想依赖于OS服务。或单独安装包。 Native(C ++)会是最好的,但是manged(C#)就可以了。

我相信数据库是一个显而易见的选择,但这需要超快速查找并加载到对象的内存中。我对数据库技术没有经验,我担心一般关系系统无法有效处理所有这些可变大小的数据。

(注意,这与我的工作无关 - 这是一个个人项目。)

根据您的经验,传统关系数据库的可行替代方案是什么?或者DB会为此工作吗?

7 个答案:

答案 0 :(得分:2)

我会试试PFS:http://blog.sensenet.hu/post/2008/05/Portal-File-System-(PFS)-an-open-source-content-repository-for-Net.aspx

太糟糕了,你在c / .Net上,因为Jackrabbit将是一个完美的选择。

答案 1 :(得分:2)

查看SQLite,它具有许多可用编程语言和环境的绑定,并且与Berkeley DB一样,是磁盘上的数据库,无需安装数据库引擎。

如果您只是添加正确的索引,查找将非常快,因为它是一个基于集合的数据库,您仍然可以进行批量查询等。

答案 2 :(得分:1)

您并未真正说明如何搜索此数据。我已经完成了一些与一些文本挖掘应用程序类似的工作,其中主要数据存储在MySQL中,但我在Ferret(项目在Ruby中)中维护文本搜索索引,以基于关键字搜索在消息表中找到适当的行。我认为这种混合方法也适合你。 SQLServer和Lucene.Net可能在C#环境中很适合您。我敢肯定,如果你环顾四周,你可以在C ++领域找到类似的解决方案。

我不建议使用SQLServer全文搜索 - Lucene和它的推导似乎是一个更好的选择。

我认为,对于任何基于文件的解决方案的数据库解决方案,您都会有更好的运气。几乎任何现代数据库都应该能够处理您的数据需求,至少在空间方面。在大型字段上构建索引是另一回事,这就是为什么我建议采用文本挖掘方法进行搜索的原因。

答案 3 :(得分:0)

听起来就像Berkeley DB的设计目标一样。但是,我没有使用它。

答案 4 :(得分:0)

也许你应该考虑像Apache + mod-dav这样的WebDav-Server。这会将内容和元数据存储在磁盘上。 对于搜索,您可以将现有搜索引擎放在此WebDav服务器之上,例如Lucene的。

通过这种方式,您可以将开发工作保持在最低限度,并开始使用强大的功能。

答案 5 :(得分:0)

您是否看过db4oKarvonite

答案 6 :(得分:-1)

查看Glimpse