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() }
}

经过深思熟虑,我发现此解决方案最有效,原因如下。

  1. 与 Cursor 不同,它不会单独检索文档进行处理(这可能非常慢)
  2. 与 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

}