Mongodb:将经常编写的集合保存在RAM中

时间:2013-09-17 19:54:10

标签: mongodb

我正在从流API中收集数据,我想创建一个实时分析仪表板。此仪表板将显示一个简单的时间序列,用于绘制每小时的文档数。我想知道我目前的方法是否是最佳的。

在以下示例中,将为流中的每个新文档触发on_data。

# Mongo collections.
records = db.records
stats = db.records.statistics

on_data(self, data):
    # Create a json document from data.
    document = simplejson.loads(data)

    # Insert the new document into records.
    records.insert(document)

    # Update a counter in records.statistics for the hour this document belongs to. 
    stats.update({ 'hour': document['hour'] }, { '$inc': { document['hour']: 1 } }, upsert=True)

以上作品。我得到一个漂亮的图表,绘制每小时的文件数量。我的问题是这种方法是否是最优的。我正在为每个文档发出两个Mongo请求。第一个插入文档,第二个更新计数器。该流每秒发送大约10个新文档。

有没有例如告诉Mongo将db.records.statistics保存在RAM中?我想这会大大减少我服务器上的磁盘访问。

1 个答案:

答案 0 :(得分:3)

MongoDB使用内存映射来处理文件I / O,因此它实际上将所有数据视为已经在RAM中,并让操作系统弄清楚细节。简而言之,你不能强迫你的集合在内存中,但如果操作系统处理得很好,那么重要的东西就是。有关mongo内存模型的更多信息以及如何优化操作系统配置以最适合您的使用案例,请查看此文档链接:http://docs.mongodb.org/manual/faq/storage/

但要具体回答你的问题:你应该没问题。在任何情况下,每秒10或20次写入不应该是磁盘瓶颈(假设您运行的是非古老的硬件)。我建议的一件事是在统计数据中建立一个“小时”的索引,如果你还没有这样做,那么让你的更新更快地找到文档。