0

IはMongoのDBに大量のデータを処理し、MongoのDBに再度格納するためのスプリングバッチフレームワークを使用していMongo Aggregate Javaドライバを使用して大きなデータをクエリしますか?

コードは以下の通りである:より少ないデータについて

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); 

(Iは100Kでテストしています)集約フレームワークはうまく動作しますが、2Mでは16MBの制限を超えています。

私は最初にそれが必要とされていない操作を$アウト使用したくないとも春データに$を使用する任意のAPIが思わなかった私ができるようになりますカーソルを返すので読んだことがある。また

をモンゴ超過したサイズの制限が、それをサポートするどんな春のデータのmongo APIもないようです。

モンゴDBバージョン:2.6

モンゴドライバのバージョン:3.2.0

+0

、それが動作するようにするために100kのレコードにあなたの処理を分割してみてください。 – jeorfevre

+0

分割しないで同じデータを扱うソリューションを手に入れたい場合 –

+0

itemprocessorのコードを提供できますか?一度に処理するデータの量 – jeorfevre

答えて

0

私はあなたが一度に2Mをコミットしようとしていることを理解。これはメモリ内のすべてのBeanをロードするために悪いことです。

この巨大な仕事を減らすには、commit-intervalを使用する必要があります。あなたはそれをしましたか?大規模なコレクションのための

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

see configuring a step in official doc

+0

私は、タスクレットを使用するのではなく、チャンクを使ってデータ全体を取ります。これは、チャンク内でデータを1つずつ読み取る他の方法がないためです –

関連する問題