【问题标题】:MongoDB Java retrieval becomes very slowMongoDB Java 检索变得很慢
【发布时间】:2015-06-04 03:17:14
【问题描述】:

我正在运行如下 Java 问题:

MongoDBManager db = new MongoDBManager(dbName, "FreqUserLog");
List<Object> distinctUIDs = db.getDistinct("uid");

int userNum = 0;
LinkedList<DBObject> samples = new LinkedList<DBObject>();
for( Object uid_obj : distinctUIDs ) {
    System.out.format( "user %d%n", ++userNum );

    BasicDBObject filter = new BasicDBObject();
    filter.put( "uid", String.valueOf(uid_obj) );
    DBCursor cursor = db.findAll(filter);

    /////////////////////////////////////// 
    while( cursor.hasNext() ) {
        DBObject userlog = cursor.next();

        // do nothing temporarily   
    }
    ///////////////////////////////////////
}

背景:程序首先获取不同的用户 ID,然后检索每个用户的所有日志。在 MongoDB 中,有 47,000 个用户。我将 VM 变量设置为“-Xms20480m”。

问题:程序最初运行速度非常快(1000 个用户需要 5 秒)。但是在处理 1000 个用户后,它变得很慢(5 个用户 1s)。有时这个数字是 1300 或 1900。处理所有用户日志似乎需要一天的时间。我还使用 Python+PyMongo 编写了相同的程序。我遇到了同样的问题。

我还尝试评论“///////////////”之间的块。程序完成得非常快。每个游标的log数大概是200左右,不知道是什么问题。

编辑: 我有“uid”和“url”的索引。 日志结构如下:

{"_id": *****
 "url": *****
 "Geo": *****
 "Log count": 3
 "Log0":{
          "event":*****
          "eventcode":*****
          "time": *****
          "ip": *****
          }
  "Log1":{
          "event":*****
          "eventcode":*****
          "time": *****
          "ip": *****
          }
   "Log3":{
          "event":*****
          "eventcode":*****
          "time": *****
          "ip": *****
          }
 }

【问题讨论】:

  • 您的数据库中的集合结构是什么,您是否在嵌入式数组中拥有用户的所有日志?你有索引吗?
  • @poiu2000 我已经编辑了我的问题。
  • 有没有可能,有些文件很大?
  • 您在运行代码时是否运行过 mongostat?输出是什么?您可以编辑问题以包含一些输出吗?您是否对查询进行了解释?您可以编辑问题以包含解释的输出吗?

标签: java mongodb


【解决方案1】:

您是否有任何理由对每个不同的 uid 进行新查询而不使用 $in?您可能会执行数千次查询才能恢复所有数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-12
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 2018-08-19
    • 1970-01-01
    相关资源
    最近更新 更多