【问题标题】:Mongo Aggregate Query on large data using java driver?使用java驱动程序对大数据进行Mongo聚合查询?
【发布时间】:2016-05-13 11:56:34
【问题描述】:

我正在使用spring批处理框架在mongo db中处理大量数据并再次存储在mongo db中

代码如下:

Aggregation agg = newAggregation(           
            project("field1")                   
                //projection on few fields                  
            group("field1")             
                //group opeartion               
            project(                
                // again project on grouped result              
            )
).withOptions(newAggregationOptions().allowDiskUse(true).build());

AggregationResults<BeanName> agreatiR = dbTemplate.aggregate(agg,collectionName,BeanName.class);

对于较少的数据(我已经在 100k 上进行了测试),聚合框架工作正常,但对于 2M,它给出了超过 16 MB 限制的例外情况。

我不想使用 $out 操作,因为首先它不是必需的,而且似乎没有任何 API 可以在 spring data mongo 中使用 $out

我也读过返回游标,这将允许超出大小限制,但似乎没有任何 Spring Data mongo API 支持它。

Mongo DB 版本:2.6

Mongo 驱动版本:3.2.0

【问题讨论】:

  • 对于大型集合,请尝试将您的处理拆分为 100k 条记录以使其正常工作。
  • 我希望能找到一个解决方案,在不拆分的情况下处理相同的数据
  • 你能提供itemprocessor的代码吗?您一次处理多少数据?
  • 我上面提到的代码是Tasklet中的代码。我正在处理 2M 数据

标签: java spring mongodb spring-data-mongodb mongo-java-driver


【解决方案1】:

我了解到您正在尝试一次提交 2M。这很糟糕,因为将所有 bean 加载到内存中。

您应该使用commit-interval 来减少这项庞大的工作。你做到了吗?

<tasklet transaction-manager="transactionManager">
        <chunk reader="itemReader" writer="itemWriter" commit-interval="500"/>
    </tasklet>

see configuring a step in official doc

【讨论】:

  • 我没有使用块,而是使用 tasklet 来获取整个数据。这是因为没有其他方法可以逐块读取数据
猜你喜欢
  • 1970-01-01
  • 2020-09-01
  • 2019-10-14
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 2016-02-11
  • 2020-08-06
  • 1970-01-01
相关资源
最近更新 更多