Таким образом, мое приложение экспортирует файл CSV размером 11,5 МБ и использует практически всю оперативную память, которая никогда не освобождается.
Данные для CSV берутся из БД, и в вышеупомянутом случае все этоэкспортируется.
Я использую стандартную библиотеку CSV Ruby 2.4.1 следующим образом:
export_helper.rb
:
CSV.open('full_report.csv', 'wb', encoding: UTF-8) do |file|
data = Model.scope1(param).scope2(param).includes(:model1, :model2)
data.each do |item|
file << [
item.method1,
item.method2,
item.methid3
]
end
# repeat for other models - approx. 5 other similar loops
end
и затем в контроллере:
generator = ExportHelper::ReportGenerator.new
generator.full_report
respond_to do |format|
format.csv do
send_file(
"#{Rails.root}/full_report.csv",
filename: 'full_report.csv',
type: :csv,
disposition: :attachment
)
end
end
После одного запроса процессы puma загружают 55% оперативной памяти всего сервера и остаются такими до тех пор, пока в конце концов не исчерпают память.
Например, в этой статье для создания файла CSV с размером строки в 75 миллионов строк требуется только 1 МБ ОЗУ.Но нет никаких запросов к БД.
Сервер имеет 1015 МБ ОЗУ + 400 МБ подкачки памяти.
Итак, мои вопросы:
- Что именно потребляет столько памяти?Это генерация CSV или связь с БД?
- Я делаю что-то не так и пропускаю утечку памяти?Или это просто как работает библиотека?
- Есть ли способ освободить память без перезапуска работников puma?
Заранее спасибо!