0

我目前正在尝试使用 Gmongo 驱动程序在 groovy 中运行批处理作业,该集合约为 8 gigs 我的问题是我的脚本试图将所有内容加载到内存中,理想情况下我希望能够批量处理类似于 Spring Boot Batch 所做的,但在 groovy 脚本中

我已经尝试过 batchSize(),但是这个函数仍然将整个集合检索到内存中,只是为了将它应用于我在批处理中的逻辑。

这是我的例子

momngoDb.collection.find().collect() it -> {
  //logic
}
4

2 回答 2

0

根据官方文档:

https://docs.mongodb.com/manual/tutorial/iterate-a-cursor/#read-operations-cursors

def myCursor = db.collection.find()

while (myCursor.hasNext()) {
   print( myCursor.next() }
}
于 2019-01-21T15:04:39.637 回答
0

经过深思熟虑,我发现这个解决方案效果最好,原因如下。

  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

}
于 2019-05-01T16:05:05.463 回答