gpt4 book ai didi

java - 使用 Java 从 mongodb 遍历所有文档的性能不佳

转载 作者:可可西里 更新时间:2023-11-01 09:52:55 29 4
gpt4 key购买 nike

我将系统日志存储在 mongodb 中,并根据“时间”字段构建索引。现在 mongodb 中大约有 190k 条日志。当我尝试在 Java 中使用 DBCollection.find() 方法获取所有日志时,它花费了将近 10 秒来遍历集合中的所有文档。我认为可能是我遗漏了什么导致性能不佳?

这是我使用的代码:

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 秒。时间对我的要求来说还是有点不能接受。有什么实现技巧可以加快遍历工作吗?

非常感谢。

最佳答案

你真的需要遍历所有文档吗?在上面的代码中,您似乎只是将每个对象一个一个地放入内存。

  1. “时间”字段上的索引应构造为“降序”,因为您是这样排序的。
  2. 如果索引是复合索引(索引中有更多字段,而不仅仅是“时间”),请确保您还添加了一个仅包含“时间”的索引。此外,当您要向该查询添加过滤器时,请确保将“时间”字段添加到索引的最后并按降序排列。
  3. 考虑到您正在一个接一个地读取 190k 个对象,性能还不错。

(请注意,我使用 mongodb 的经验不涉及使用 Java 驱动程序)

关于java - 使用 Java 从 mongodb 遍历所有文档的性能不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13248428/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com