MongoDB:BigData上的FindIterable <document>

时间:2015-11-12 08:57:36

标签: java mongodb

我在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方式更快吗?

修改我用计算更新了方法。这应该没关系,因为当我删除它时,运行时间仍然非常高,如上所述。

0 个答案:

没有答案