Skip to content

Commit cb812b9

Browse files
committed
Fix memory leak during successful CSV rendering
- Delay return until Context Manager `with open()` has finished and force GC in between. - Explicitly `del` data, reader, sheets when they are on longer used.
1 parent de159c4 commit cb812b9

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

mfr/extensions/tabular/libs/stdlib_tools.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ def csv_stdlib(fp):
2020
else:
2121
_set_dialect_quote_attrs(dialect, data)
2222

23+
del data
2324
reader = csv.DictReader(fp, dialect=dialect)
2425
columns = []
2526
# update the reader field names to avoid duplicate column names when performing row extraction
@@ -53,6 +54,7 @@ def csv_stdlib(fp):
5354
if not columns and not rows:
5455
raise EmptyTableError('Table empty or corrupt.', extension='csv')
5556

57+
del reader
5658
return {'Sheet 1': (columns, rows)}
5759

5860

mfr/extensions/tabular/render.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,20 @@ def render(self):
3232

3333
with open(self.file_path, errors='replace') as fp:
3434
sheets, size, nbr_rows, nbr_cols = self._render_grid(fp, self.metadata.ext)
35-
# gc.collect()
36-
if sheets and size:
37-
return self.TEMPLATE.render(
38-
base=self.assets_url,
39-
width=settings.TABLE_WIDTH,
40-
height=settings.TABLE_HEIGHT,
41-
sheets=json.dumps(sheets),
42-
options=json.dumps(size),
35+
36+
# Force GC
37+
gc.collect()
38+
39+
if sheets and size:
40+
return self.TEMPLATE.render(
41+
base=self.assets_url,
42+
width=settings.TABLE_WIDTH,
43+
height=settings.TABLE_HEIGHT,
44+
sheets=json.dumps(sheets),
45+
options=json.dumps(size),
4346
)
44-
# gc.collect()
47+
48+
assert nbr_rows and nbr_cols
4549
raise exceptions.TableTooBigError(
4650
'Table is too large to render.',
4751
extension=self.metadata.ext,
@@ -93,6 +97,7 @@ def _render_grid(self, fp, ext, *args, **kwargs):
9397
break
9498

9599
if table_too_big:
100+
del sheets
96101
return None, None, nbr_rows, nbr_cols
97102

98103
return sheets, size, None, None

0 commit comments

Comments
 (0)