Если проблема в памяти, вы могли бы просто записать в модуль записи ответов, который пишет непосредственно в выходной поток? Таким образом, вы ничего не храните (много) в памяти и не должны записывать временные файлы:
// controller action for CSV download
def download = {
response.setContentType("text/csv")
response.setHeader("Content-disposition", "attachment;filename=downloadFile.csv")
def results = // get all your results
results.each { result ->
out << result.col1 << ',' << result.col2 // etc
out << '\n'
}
}
Это записывает в выходной поток, поскольку он зацикливается вокруг ваших результатов.
Теоретически Вы можете сделать это еще более эффективным с помощью памяти с помощью прокручиваемого набора результатов - см. Раздел «Использование прокручиваемых результатов» Запросы с помощью GORM - Критерии - и зацикливание во время записи ответа писатель. Теоретически это означает, что вы также не загружаете все результаты вашей БД в память, но на практике это может работать не так, как ожидается, если вы используете MySQL (и его Java-коннектор). Также может сработать пакетирование запросов вручную (получить строки БД 1-10000, выписать, получить 10001-20001 и т. Д.)
Подобные вещи могут быть более сложными с JSON, в зависимости от того, какую библиотеку вы используете для визуализации ваших объектов.