MonogoDB如何为非常大的数据集堆叠,其中只有一些数据是易失的

我正在开展一个项目,我们定期通过IMAP或POP收集大量电子邮件,对其进行分析(例如聚类到对话,提取重要句子等),然后通过网络呈现视图到最后用户。 主视图将是一个类似Facebook的个人资料页面,用于最近(大约20个)对话的每个联系人,每个对话都来自我们捕获的电子邮件。 对我们而言,能够经常快速地检索个人资料页面和最近20个项目非常重要。我们也可能经常在此Feed中插入最近的电子邮件。为此,文档存储和MongoDB的低成本原子写入看起来非常有吸引力。 然而,我们还会有大量的旧电子邮件会话,这些会话不会经常被访问(因为它们不会出现在最近的20个项目中,人们只会在他们搜索它们时看到它们,这将是相对罕见)。此外,随着时间的推移,此数据的大小将比联系人存储的增长更快。 从我读过的内容来看,MongoDB似乎或多或少地要求整个数据集保留在RAM中,解决这个问题的唯一方法就是使用虚拟内存,这会带来很大的开销。特别是如果Mongo无法区分易失性数据(配置文件/提要)和非易失性数据(旧电子邮件),这可能最终会非常讨厌(因为它似乎将虚拟内存分配转移到操作系统,我不知道Mongo怎么可能这样做。 似乎唯一的选择是(a)购买足够的RAM来存储所有内容,这对于易失性数据来说很好,但是对于捕获TB的电子邮件几乎没有成本效益,或者(b)使用虚拟内存并且看到读取/写入我们的易失性数据慢慢爬行。 这是正确的,还是我错过了什么? MongoDB是否适合这个特殊问题?如果是这样,配置会是什么样的?     
已邀请:
MongoDB使用mm​​ap将文档映射到虚拟内存(而不是物理RAM)。 Mongo不要求整个数据集都在RAM中,但是你需要在内存中使用“工作集”(工作集应该是整个数据集的一个子集)。 如果您想避免将大量电子邮件映射到虚拟内存,您可以让您的配置文件包含一个ObjectIds数组,这些ObjectIds引用存储在单独集合中的电子邮件。     
MongoDB不“要求整个数据集保留在RAM中”。请参阅http://www.mongodb.org/display/DOCS/Caching,了解其使用虚拟内存的原因和方式。 这个应用程序没问题。例如,如果您的排序和过滤更复杂,您可能希望使用Map-Reduce操作来创建“显示就绪”的集合,但对于简单的日期排序集,现有索引将正常工作。     
@Andrew J. 典型的是你需要足够的RAM来保存你的工作集,对于MongoDB来说这是正确的,因为它适用于RDBMS。因此,如果您想要为所有用户保留最后20封电子邮件而无需转到磁盘,那么您需要那么多内存。如果这超出单个系统上的内存,则可以使用MongoDB的分片功能在多台计算机之间传播数据,从而聚合群集中计算机的内存,CPU和IO带宽。 @mp MongoDB允许您作为应用程序开发人员指定写入的持久性,从内存中的单个节点到磁盘上的多个节点。选择取决于您的需求和数据的重要性;并非所有数据都是平等创建的。此外,在MongoDB 1.8中,您可以指定--dur,这会为所有写入写入日志文件。如果出现崩溃,这可以进一步提高写入的持久性并加快恢复速度。     
如果你的计算机崩溃了Mongo在内存中的所有东西,会发生什么。我猜它没有日志所以答案可能是运气不好。     

要回复问题请先登录注册