代码之家  ›  专栏  ›  技术社区  ›  Foredecker

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

  •  2
  • Foredecker  · 技术社区  · 16 年前

    我需要开发一个存储大量(成千上万的10到100个)对象的系统。每个对象都类似于电子邮件——有一个主文本正文和几个大小有限的辅助文本字段。正文的大小将从几个字节到几个KB不等。

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

    只有在向存储中添加对象时,才会写入存储。它会经常被读取。删除将是罕见的。数据几乎都是人类可读的文本,因此很容易压缩。

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

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

    数据管理系统需要成为我的应用程序的一部分——我不想依赖操作系统服务。或单独安装的软件包。本机(C++)最好,但管理(C#)的东西也可以。

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

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

    根据您的经验,传统关系数据库的可行替代方案是什么?或者DB能很好地解决这个问题吗?

    7 回复  |  直到 16 年前
        1
  •  2
  •   Lasse V. Karlsen    16 年前

    SQLite ,它对许多可用的编程语言和环境都有绑定,就像 Berkeley DB ,磁盘上的数据库,无需安装数据库引擎。

    如果你只是添加了正确的索引,查找将非常快,而且由于它本质上是一个基于集合的数据库,你仍然可以进行批量查询和类似的操作。

        2
  •  2
  •   Bogdan    16 年前

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

    可惜你在c/上。网,因为Jackrabbit会是一个完美的选择。

        3
  •  1
  •   tvanfosson    16 年前

    你并没有真正表明你将如何搜索这些数据。我在一些文本挖掘应用程序中做了一些类似的工作,其中主要数据存储在MySQL中,但我在Ferret中维护了一个文本搜索索引(该项目是在Ruby中),以便根据关键字搜索在消息表中找到相应的行。我认为这种混合方法也适用于你。SQLServer和Lucene。Net可能在C#环境中运行良好。我相信,如果你环顾四周,你会在C++领域找到类似的解决方案。

    我不建议使用SQLServer全文搜索——Lucene及其衍生产品似乎是一个更好的选择。

    我认为,与基于文件的解决方案相比,使用任何数据库解决方案都会有更好的运气。几乎任何现代数据库都应该能够处理您的数据需求,至少在空间方面是这样。在大型字段上构建索引是另一回事,这就是为什么如果你需要搜索它,我会推荐一种文本挖掘方法。

        4
  •  0
  •   Darius Bacon    16 年前

    听起来就像Berkeley DB的设计初衷。然而,我还没有用过它。

        5
  •  0
  •   mkoeller    16 年前

    也许你应该考虑一下像Apache+mod-dav这样的WebDav服务器。这将把内容和元数据存储在磁盘上。 为了进行搜索,您可以在这个WebDav服务器上放置一个现有的搜索引擎,例如Lucene。

    这样,您可以将自己的开发保持在最低限度,并从一系列强大的功能开始。

        6
  •  0
  •   Gergely Orosz    16 年前

    你看过吗 db4o Karvonite ?

        7
  •  -1
  •   Thevs    16 年前

    看一看 Glimpse .