From b37f706d66333e529cdb6ba8a255ff9c08601bec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adri=C3=A1n=20Bernardi?= Date: Tue, 14 Mar 2023 11:42:26 -0300 Subject: [PATCH] lims, lims_report_html: avoid memory leak when plotting trend charts --- lims/control_tendency.py | 18 ++++++++++++++++++ lims_report_html/html_template.py | 3 +++ lims_report_html/results_report.py | 2 ++ 3 files changed, 23 insertions(+) diff --git a/lims/control_tendency.py b/lims/control_tendency.py index 5bb08cd..6f5f283 100644 --- a/lims/control_tendency.py +++ b/lims/control_tendency.py @@ -6,6 +6,7 @@ import pandas as pd from io import BytesIO from math import sqrt import matplotlib.pyplot as plt +import gc from trytond.model import ModelView, ModelSQL, fields from trytond.wizard import (Wizard, StateTransition, StateView, StateAction, @@ -1979,8 +1980,14 @@ class TrendChart(ModelSQL, ModelView): i += 1 ax.get_figure().savefig(output, bbox_inches='tight', dpi=300) + plt.close('all') image = output.getvalue() output.close() + # release memory + del ax, df, df_interpolated + if ds2: + del df2, df2_interpolated + gc.collect() return image except (TypeError, ModuleNotFoundError): @@ -2013,12 +2020,23 @@ class TrendChart(ModelSQL, ModelView): ax.get_figure().savefig(output, bbox_inches='tight', dpi=300) + plt.close('all') image = output.getvalue() output.close() + # release memory + del ax, df, df_interpolated + if ds2: + del df2, df2_interpolated + gc.collect() return image except (TypeError, ModuleNotFoundError): pass + # release memory + del df, df_interpolated + if ds2: + del df2, df2_interpolated + gc.collect() return output.getvalue() @classmethod diff --git a/lims_report_html/html_template.py b/lims_report_html/html_template.py index d6630b3..038133e 100644 --- a/lims_report_html/html_template.py +++ b/lims_report_html/html_template.py @@ -431,9 +431,12 @@ class LimsReport(Report): for section in record.following_sections: filedata = BytesIO(section.data) merger.append(filedata) + filedata.close() output = BytesIO() merger.write(output) + merger.close() document = output.getvalue() + output.close() return 'pdf', document diff --git a/lims_report_html/results_report.py b/lims_report_html/results_report.py index e922664..54de220 100644 --- a/lims_report_html/results_report.py +++ b/lims_report_html/results_report.py @@ -417,6 +417,7 @@ class ResultsReportVersionDetailSample(metaclass=PoolMeta): open_chart.transition_compute() plot = tc.chart.get_plot(session_id) charts.append(plot) + OpenTrendChart.delete(session_id) div_row = '
' charts_x_row = int(self.version_detail.charts_x_row) or 1 @@ -464,6 +465,7 @@ class ResultsReportVersionDetailSample(metaclass=PoolMeta): open_chart.transition_compute() plot = tc.chart.get_plot(session_id) charts.append(plot) + OpenTrendChart.delete(session_id) return charts def _get_resource(self, obj):