Groovy Gmongo пакетной обработки
В настоящее время я пытаюсь запустить пакетную обработку в groovy с драйвером Gmongo, коллекция составляет около 8 гигов, моя проблема в том, что мой скрипт пытается загрузить все в памяти, в идеале я хотел бы иметь возможность обрабатывать это в пакетном режиме похоже на то, что делает Spring Boot Batch, но в отличных скриптах
Я пробовал batchSize(), но эта функция по-прежнему извлекает всю коллекцию в память только для применения ее к моей логике в пакетном процессе.
вот мой пример
momngoDb.collection.find().collect() it -> {
//logic
}
1 ответ
После обдумывания я нашел, что это решение работает лучше всего по следующим причинам.
- В отличие от курсора, он не извлекает документы на единственной основе для обработки (что может быть очень медленным)
- В отличие от пакетной функции 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() }
}