【问题标题】:Storing large numbers of varying size objects on disk在磁盘上存储大量不同大小的对象
【发布时间】:2010-09-20 15:02:01
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: data-structures storage


    【解决方案1】:

    看看SQLite,它绑定了许多可用的编程语言和环境,就像Berkeley DB一样,是一个磁盘上的数据库,不需要安装数据库引擎。

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

    【讨论】:

      【解决方案2】:

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

      可惜你在 c/.Net 上,因为 Jackrabbit 本来是一个完美的选择。

      【讨论】:

        【解决方案3】:

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

        我不推荐使用 SQLServer 全文搜索 -- Lucene 及其衍生产品似乎是更好的选择。

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

        【讨论】:

        • 您好 Tvanfosson,我将把索引保存在内存中,使用它将索引映射到对象的单个(和主)键。获得密钥后,我将从磁盘或缓存中加载它。谢谢你的建议:)
        【解决方案4】:

        听起来正是 Berkeley DB 的设计目的。不过我没用过。

        【讨论】:

          【解决方案5】:

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

          通过这种方式,您可以将自己的开发工作保持在最低限度,并从一系列强大的功能开始。

          【讨论】:

            【解决方案6】:

            你看过db4oKarvonite吗?

            【讨论】:

              【解决方案7】:

              看看Glimpse

              【讨论】:

              • 奇怪的人......如果你不明白或不喜欢这个想法,为什么要投反对票?!至少这应该与我错了的解释相吻合。
              • 您提供的链接指向的东西根本不是问题的解决方案。我可以想办法让它做一些被要求的事情,但这将是一个 DailyWTF 值得破解的方法。
              • 再看看。它符合所有提到的要求,除了可能与 C++ 集成,但它有一个可链接的库。它有索引、缓存,甚至是请求服务器。而且速度超快。
              猜你喜欢
              • 2017-11-11
              • 1970-01-01
              • 2018-06-13
              • 2016-12-04
              • 1970-01-01
              • 2012-08-01
              • 2013-05-23
              • 2015-10-09
              • 2012-09-13
              相关资源
              最近更新 更多