Groovy Gmongo пакетной обработки

В настоящее время я пытаюсь запустить пакетную обработку в groovy с драйвером Gmongo, коллекция составляет около 8 гигов, моя проблема в том, что мой скрипт пытается загрузить все в памяти, в идеале я хотел бы иметь возможность обрабатывать это в пакетном режиме похоже на то, что делает Spring Boot Batch, но в отличных скриптах

Я пробовал batchSize(), но эта функция по-прежнему извлекает всю коллекцию в память только для применения ее к моей логике в пакетном процессе.

вот мой пример

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

1 ответ

После обдумывания я нашел, что это решение работает лучше всего по следующим причинам.

  1. В отличие от курсора, он не извлекает документы на единственной основе для обработки (что может быть очень медленным)
  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

}

В соответствии с официальным документом:

https://docs.mongodb.com/manual/tutorial/iterate-a-cursor/

def myCursor = db.collection.find()

while (myCursor.hasNext()) {
   print( myCursor.next() }
}
Другие вопросы по тегам