【发布时间】: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?输出是什么?您可以编辑问题以包含一些输出吗?您是否对查询进行了解释?您可以编辑问题以包含解释的输出吗?