我在ubuntu 14上使用java 7和mongoDB 3.0的java驱动程序。
我使用mongoDB工作了几个月的BigData项目。在分析了我的项目表现后,我发现了一个瓶颈。我的一些查询将包含数百万个文档。我得到的结果是FindIterable类型。当我执行计算时,我必须遍历每个文档,mongoDB文档告诉我做一个iterable.forEach。所以我的代码看起来像这样:
这是我的一个疑问:
FindIterable<Document> iterable = db.getCollection(dbName).find(
new Document()
.append("timestamp", new Document()
.append("$gte", startTime)
.append("$lte", endTime))
.append("latitude", new Document()
.append("$lte", maxLat))
.append("latitude", new Document()
.append("$gte", minLat))
.append("longitude", new Document()
.append("$lte", maxLong))
.append("longitude", new Document()
.append("$gte", minLong))
);
然后我将该iterable传递给我的createLayer函数。
protected double[][] createLayer(FindIterable<Document> iterable) {
int x = (int) ((maxLat * 100000) - (minLat * 100000));
int y = (int) ((maxLong * 100000) - (minLong * 100000));
final double[][] matrix = new double[x][y];
iterable.forEach(new Block<Document>() {
@Override
public void apply(final Document document) {
//System.out.println(document.get("longitude")+" - "+ document.get("latitude"));
int tempLong = (int) ((Double.parseDouble(document.get("longitude").toString())) * 100000);
int x = (int) (maxLong * 100000) - tempLong;
int tempLat = (int) ((Double.parseDouble(document.get("latitude").toString())) * 100000);
int y = (int) (maxLat * 100000) - tempLat;
matrix[y][x] += 1;
}
});
return matrix;
}
当我的iterable包含350万个文档时,我的运行时间约为80秒。如果我删除“次要计算”,则运行时间约为76秒。显然,我的计算不是这里的瓶颈,而是每个文档的迭代。
我在SO上查看this帖子,但由于我没有使用java 8,因此lambda操作不可用。
所以,我的问题是,是iterable.forEach迭代大量文档的最快方法吗? FindIterable到底包含什么? iterable.forEach是否因为查询数据库而变慢? lambda方式更快吗?
修改我用计算更新了方法。这应该没关系,因为当我删除它时,运行时间仍然非常高,如上所述。