8

我正在做一个项目,我们定期通过 IMAP 或 POP 收集大量电子邮件,对其进行分析(例如聚类到对话中,提取重要句子等),然后通过网络将视图呈现到最后用户。

主视图将是一个类似于 facebook 的个人资料页面,用于每个联系人的最近(20 个左右)对话,这些对话来自我们捕获的电子邮件。

对我们来说,能够频繁快速地检索个人资料页面和最近的 20 项非常重要。我们也可能经常在此提要中插入最近的电子邮件。为此,文档存储和 MongoDB 的低成本原子写入似乎很有吸引力。

但是,我们也会有大量不经常访问的旧电子邮件对话(因为它们不会出现在最近的 20 个项目中,人们只有在搜索它们时才会看到它们,这将是比较少见)。此外,随着时间的推移,此数据的大小将比联系人存储增长得更快。

根据我的阅读,MongoDB 似乎或多或少要求整个数据集保留在 RAM 中,解决此问题的唯一方法是使用虚拟内存,这可能会带来很大的开销。特别是如果 Mongo 无法区分易失性数据(配置文件/提要)和非易失性数据(旧电子邮件),这最终可能会非常令人讨厌(并且因为它似乎将虚拟内存分配转移给了操作系统,我不明白 Mongo 怎么可能做到这一点)。

似乎唯一的选择是(a)购买足够的 RAM 来存储所有内容,这对于易失性数据来说很好,但对于捕获 TB 的电子邮件来说几乎没有成本效益,或者(b)使用虚拟内存并查看读取/写入我们的易失性数据缓慢到爬行。

这是正确的,还是我错过了什么?MongoDB 是否适合解决这个特殊问题?如果是这样,配置会是什么样子?

4

4 回答 4

3

MongoDB 并不要求整个数据集保留在 RAM 中”。请参阅http://www.mongodb.org/display/DOCS/Caching以了解它为何/如何以这种方式使用虚拟内存的解释。

这个应用程序很好。例如,如果您的排序和过滤更复杂,您可能希望使用 Map-Reduce 操作来创建一个“准备好显示”的集合,但对于简单的日期排序集,现有索引就可以正常工作。

于 2011-02-04T01:53:31.760 回答
2

MongoDB 使用 mmap 将文档映射到虚拟内存(而不是物理 RAM)。Mongo 不需要整个数据集都在 RAM 中,但您会希望您的“工作集”在内存中(工作集应该是整个数据集的子集)。

如果您想避免将大量电子邮件映射到虚拟内存中,您可以让您的配置文件包含一个 ObjectId 数组,该数组引用存储在单独集合中的电子邮件。

于 2011-02-04T01:49:08.637 回答
1

@Andrew J 通常,您需要足够的 RAM 来保存您的工作集,这对于 MongoDB 和 RDBMS 一样适用。因此,如果您想在不使用磁盘的情况下为所有用户保存最后 20 封电子邮件,那么您需要那么多内存。如果这超出了单个系统上的内存,那么您可以使用 MongoDB 的分片功能将数据分布在多台机器上,从而聚合集群中机器的内存、CPU 和 IO 带宽。

@mP MongoDB 允许您作为应用程序开发人员指定写入的持久性,从内存中的单个节点到磁盘上的多个节点。选择取决于您的需求以及数据的重要性;并非所有数据都是平等创建的。此外,在 MongoDB 1.8 中,您可以指定--dur,这将为所有写入写入一个日志文件。这进一步提高了写入的持久性,并在发生崩溃时加快恢复速度。

于 2011-02-04T01:31:52.550 回答
-8

如果您的计算机因 Mongo 内存中的所有内容而崩溃,会发生什么情况。我猜它没有日志,所以答案可能是运气不好。

于 2011-02-04T00:23:41.637 回答