Mongodb阅读大集合

时间:2013-11-02 20:22:53

标签: java performance mongodb etl

我有一个ETL过程需要从一个非常大的Mongo集合(1.5亿个文档)中提取数据。我最初使用的是Spring数据模板:

this.template.find(this.mongoQuery.limit(this.pageSize).skip(this.pageSize * this.currentPage++), MyModel.class, this.collection);

当我在我的开发环境中运行ETL对1700万个文档(每100K文档20秒,pageSize)时,这很好用,但是在1150万条记录之后它将从20秒到4分钟来检索下一页。此外,这根本没有扩展至1.6亿个文件。

我遇到的一个主要问题是我不控制mongo集合的结构方式,我的过滤条件基于文档中几个属性日期属性的日期范围,并且这些日期未编入索引因为使用此集合的客户端不按这些日期过滤,只有我的ETL过滤。

我改变了我的实现,只使用java Mongo驱动程序并将batchSize设置为500K,这似乎表现更好,在我的开发环境中我没有达到1150万之后的减速。所以,我的代码变成了

cursor = this.template.getCollection(collection).find(mongoQuery.getQueryObject());
cursor.batchSize(pageSize);
//batch logic
List<MyModel> models = new ArrayList<MyModel>();
    for (DBObject result : cursor) {
        models.add(this.template.getConverter().read(MyModel.class, result));
        counter++;
        if (counter >= this.pageSize) {
            break;
        }
    }
    this.currentPage++;

    return models;

我没有现场发布此更改,因此我不知道它的效果如何。使用不在这个非常大的集合上索引属性的标准来收集我感兴趣的文档的最佳方法是什么?如果这不起作用,唯一的另一个想法是不传递标准并获取所有文档,迭代我的ETL中的1.5亿个文档并在那里进行过滤。

0 个答案:

没有答案