Groovy gmongo批处理
Groovy gmongo batch processing
我目前正在尝试 运行 使用 Gmongo 驱动程序在 groovy 中进行批处理作业,该集合大约有 8 个演出,我的问题是我的脚本试图将所有内容加载到内存中,理想情况下,我希望能够像 Spring Boot Batch 那样批量处理,但是在 groovy 脚本
中
我试过 batchSize(),但这个函数仍然将整个集合检索到内存中,只是为了将它应用到我的批处理逻辑中。
这是我的例子
momngoDb.collection.find().collect() it -> {
//logic
}
根据官方文档:
https://docs.mongodb.com/manual/tutorial/iterate-a-cursor/#read-operations-cursors
def myCursor = db.collection.find()
while (myCursor.hasNext()) {
print( myCursor.next() }
}
经过深思熟虑,我发现此解决方案最有效,原因如下。
- 与 Cursor 不同,它不会单独检索文档进行处理(这可能非常慢)
- 与 Gmongo 批处理功能不同,它也不会尝试将整个集合上传到内存中,只是将其分成批次进行处理,这往往会占用大量机器资源。
根据您的批量大小,下面的代码非常高效且占用资源少。
def skipSize = 0
def limitSize = Integer.valueOf(1000) batchSize (if your going to hard code the batch size then you dont need the int convertion)
def dbSize = Db.collectionName.count()
def dbRunCount = (dbSize / limitSize).round()
dbRunCount.times { it ->
dstvoDsEpgDb.schedule.find()
.skip(skipSize)
.limit(limitSize)
.collect { event ->
//run your business logic processing
}
//calculate the next skipSize
skipSize += limitSize
}
我目前正在尝试 运行 使用 Gmongo 驱动程序在 groovy 中进行批处理作业,该集合大约有 8 个演出,我的问题是我的脚本试图将所有内容加载到内存中,理想情况下,我希望能够像 Spring Boot Batch 那样批量处理,但是在 groovy 脚本
中我试过 batchSize(),但这个函数仍然将整个集合检索到内存中,只是为了将它应用到我的批处理逻辑中。
这是我的例子
momngoDb.collection.find().collect() it -> {
//logic
}
根据官方文档:
https://docs.mongodb.com/manual/tutorial/iterate-a-cursor/#read-operations-cursors
def myCursor = db.collection.find()
while (myCursor.hasNext()) {
print( myCursor.next() }
}
经过深思熟虑,我发现此解决方案最有效,原因如下。
- 与 Cursor 不同,它不会单独检索文档进行处理(这可能非常慢)
- 与 Gmongo 批处理功能不同,它也不会尝试将整个集合上传到内存中,只是将其分成批次进行处理,这往往会占用大量机器资源。
根据您的批量大小,下面的代码非常高效且占用资源少。
def skipSize = 0
def limitSize = Integer.valueOf(1000) batchSize (if your going to hard code the batch size then you dont need the int convertion)
def dbSize = Db.collectionName.count()
def dbRunCount = (dbSize / limitSize).round()
dbRunCount.times { it ->
dstvoDsEpgDb.schedule.find()
.skip(skipSize)
.limit(limitSize)
.collect { event ->
//run your business logic processing
}
//calculate the next skipSize
skipSize += limitSize
}