使用Java遍历mongodb中所有文档的性能较差
我将系统日志存储在mongodb中,并根据“时间”字段建立索引。现在mongodb中大约有190k个日志。 当我尝试在Java中使用DBCollection.find()方法获取所有日志时,遍历集合中的所有文档几乎要花费10秒钟。我想可能是我错过了什么导致了糟糕的表现 以下是我使用的代码:使用Java遍历mongodb中所有文档的性能较差,java,mongodb,mongodb-java,Java,Mongodb,Mongodb Java,我将系统日志存储在mongodb中,并根据“时间”字段建立索引。现在mongodb中大约有190k个日志。 当我尝试在Java中使用DBCollection.find()方法获取所有日志时,遍历集合中的所有文档几乎要花费10秒钟。我想可能是我错过了什么导致了糟糕的表现 以下是我使用的代码: mongo = new Mongo(); DB db = mongo.getDB("Log"); DBCollection coll = db.getCollection("SystemLog"); int
mongo = new Mongo();
DB db = mongo.getDB("Log");
DBCollection coll = db.getCollection("SystemLog");
int count = 0;
long findStart = Calendar.getInstance().getTimeInMillis();
// Sort by time.
BasicDBObject queryObj = new BasicDBObject();
queryObj.put("time", -1);
DBCursor cursor = coll.find().sort(queryObj);
while(cursor.hasNext()) {
DBObject obj = cursor.next();
// Do something
++count;
}
long findEnd = Calendar.getInstance().getTimeInMillis();
System.out.println("Time for traversing all system logs (" + count + "):\t" + (findEnd-findStart) + "ms.");
打印结果为:
Time for traversing all system log (194309): 10496ms.
我已经试过好几次了。似乎一次运行或多次运行没有区别。虽然我也尝试过删除sort(),只是从mongodb中查找所有注销的日志。遍历所有文档大约需要6秒钟。时间对我的要求来说还是有点不可接受。是否有任何实现技巧可以加快遍历工作
非常感谢。您真的需要遍历所有文档吗?在上面的代码中,看起来您只是一个接一个地将每个对象带入内存
(请注意,我使用mongodb的经验并不涉及使用Java驱动程序)感谢您的回复和建议。是的,我需要遍历所有文档。实际上,我需要做的是将所有日志从mongodb导出到一个文件中,因此我必须将文档一个接一个地放入内存(并将它们写入固定格式的文本文件)。但是,我希望这项工作可以在不超过5秒钟内完成,因为在生成日志文件后,用户必须再等待几秒钟才能下载日志文件。请确保时间下降的索引存在。此外,我会尝试一次获得几个k的对象。对查询进行限制和跳过(Java驱动程序应该处理这个问题),并将对象分块获取。查看mongo事件探查器,看看那里发生了什么。最好的情况是,每次都会看到一个游标,它以完全索引的方式返回大块对象。