Ich verwende Spring Batch Framework, um große Datenmengen in Mongo DB zu verarbeiten und erneut in Mongo DB zu speichern
Der Code ist wie folgt:
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);
Für weniger Daten (ich habe es auf 100.000 getestet) funktioniert das Aggregat-Framework gut, für 2M gibt es jedoch eine Ausnahme von 16 MB.
Ich möchte die $ out-Operation nicht verwenden, da sie erstens nicht erforderlich ist und es scheint, dass keine API verwendet wird, um $ out in Spring Data Mongo zu verwenden
Ich habe auch von zurückkehrenden Cursern gelesen, die das Überschreiten der Größenbegrenzung zulassen, aber auch hier scheint es keine Spring Data Mongo API zu geben, die dies unterstützt.
Mongo DB-Version: 2.6
Mongo-Treiberversion: 3.2.0
Antworten:
0 für die Antwort № 1Ich habe verstanden, dass Sie versuchen, 2M auf einmal zu übergeben. Dies ist schlecht, weil alle Beans in den Speicher geladen werden.
Du solltest benutzen commit-interval
um diesen riesigen Job zu reduzieren. Hast du das gemacht?
<tasklet transaction-manager="transactionManager">
<chunk reader="itemReader" writer="itemWriter" commit-interval="500"/>
</tasklet>
Siehe Konfigurieren eines Schritts im offiziellen Dokument