【问题标题】:mongodb/mongoose aggregate memory usage very big+mongodb/mongoose 聚合内存使用量非常大+
【发布时间】:2018-01-20 16:53:08
【问题描述】:

我有一个 mongodb,多个传感器每天将其数据转储一次以 一个MongoDB。本质上的每个文档是:{ sid , date, data }sensor_iddate 作为日期(我只使用日期组件)和一个包含数百个值的 data 数组。

现在我希望能够获得概览统计数据,了解我每天有多少传感器数据。这种聚合效果很好,虽然我有几十个元素,但即使我有几百个文档,查询也永远不会完成。

function dailyStatistic(callback) {
    return air
       .aggregate( [
           { $match: {} }, 
           { $group: {  _id: { date: '$date' },  myCount: { $sum: 1 } } }
       ])
       .allowDiskUse(true);
}

air 是我的猫鼬收藏的名称。

聚合实际上应该只是返回:

[ {date:2017-08-07, myCount: 10}, {date:2017-08-08}, myCount: 26} ]

现在,当我(通过一瞥)观察机器时,我得到 CPU_IOWAIT 和 MEMSWAP 错误,这最终会在 node.js 进程获取数据之前杀死它。

当我在 robomongo 上查看收藏时,我可以轻松浏览 不同的数据点。但也在 robomongo 中,这个脚本永远不会让我 结果:

db.getCollection('air').find({}).length()

有什么想法吗? 谢谢安德烈亚斯

【问题讨论】:

  • 你有日期索引吗? $match 也没用
  • 我不认为这是索引问题。即使没有索引,Mongo 也可以很好地处理数百万个文档,但这需要更长的时间,但仍然如此。你的机器有多少内存?我建议看一下 mongo 配置,如果一切正常,请查看连接字符串。
  • 我有 8 GB RAM。在 Mongodb 配置中没有什么异常;我在 mongodb 中找不到任何限制 RAM / 缓存消耗的选项。
  • 我相信这与每个文档的大小有关。我将开始缩小文档的大小,直到它起作用,并进一步评论。

标签: node.js mongodb mongoose robo3t


【解决方案1】:

您可能在日期 db.getCollection('air').createIndex({date:1})

没有索引

db.getCollection('air').find({}).length()浏览所有结果

改为使用db.getCollection('air').count({})

【讨论】:

  • 计数有效!谢谢!我的集合中正好有 3500 个文档。甚至 find.length() 函数在返回数字之前都会被杀死。
【解决方案2】:

在不使 MongoDb 崩溃的情况下执行此操作的最佳方法是获取某个日期范围的数据。在你的情况下 1 天。

function dailyStatistic(dateMin,dateMax,callback) {
return air
    .aggregate( [
        { $match: {
            date:{$gte:dateMin,$lte:dateMax}} },
        {
            $project:{
                sid:1,
                date:1,
                data:1,
                day: {$day: "$date"},
                month: {$month: "$date"},
                year: {$year: "$date"}
            }
        },
        { $group: {  _id: {day: "$day",month: "$month", year: "$year"},  myCount: { $sum: 1 } } }
    ])
    .allowDiskUse(true);}

当每小时/分钟可用的记录也太大时,您可以通过添加分页来进一步做到这一点。

正如pagetronic 建议的那样,如果您还没有创建索引,请创建索引。

【讨论】:

  • 谢谢!我的收藏只有 3500 个文档。我认为它应该真正聚合那些没有任何索引或分页的。
  • 当您的数据增长时,索引会产生很大的不同。但是您找到解决问题的方法了吗?
  • 嗨,保罗!不,我的问题仍未解决。 :-( 我已将日期的数据类型从“日期”更改为数字(现在使用 unix 整数时间戳)。这似乎有点帮助。我还清理了文档 JSON 结构(删除了我不再需要的字段). 这也有点帮助。我想这与 JSON 解析是 cpu 和内存密集型有关。但我不完全确定。
  • 好的,我对查询进行了一些更改。对于按日期分组,分组将按时间戳进行,您可能会看到该特定时间戳的计数。为了克服这个问题,您必须首先获得日、月和年,然后将它们分组。我没有对此进行测试,但应该会给你正确的结果。
猜你喜欢
  • 1970-01-01
  • 2020-10-05
  • 2015-08-01
  • 1970-01-01
  • 2015-07-06
  • 2020-10-14
  • 2016-07-02
  • 1970-01-01
  • 2019-01-21
相关资源
最近更新 更多