Skip to content

Commit 84cd03a

Browse files
authored
Fix mem leak in read_csv (#57084)
* Fix memory leak in read_csv * whatsnew * peakmem benchmark
1 parent b5a963c commit 84cd03a

File tree

3 files changed

+13
-0
lines changed

3 files changed

+13
-0
lines changed

asv_bench/benchmarks/io/csv.py

+3
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,9 @@ def time_read_stringcsv(self, engine):
408408
def time_read_bytescsv(self, engine):
409409
read_csv(self.data(self.BytesIO_input), engine=engine)
410410

411+
def peakmem_read_csv(self, engine):
412+
read_csv(self.data(self.BytesIO_input), engine=engine)
413+
411414

412415
class ReadCSVCategorical(BaseIO):
413416
fname = "__test__.csv"

doc/source/whatsnew/v2.2.1.rst

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ including other versions of pandas.
1313

1414
Fixed regressions
1515
~~~~~~~~~~~~~~~~~
16+
- Fixed memory leak in :func:`read_csv` (:issue:`57039`)
1617
- Fixed performance regression in :meth:`Series.combine_first` (:issue:`55845`)
1718
- Fixed regression in :func:`merge_ordered` raising ``TypeError`` for ``fill_method="ffill"`` and ``how="left"`` (:issue:`57010`)
1819
- Fixed regression in :meth:`DataFrameGroupBy.idxmin`, :meth:`DataFrameGroupBy.idxmax`, :meth:`SeriesGroupBy.idxmin`, :meth:`SeriesGroupBy.idxmax` ignoring the ``skipna`` argument (:issue:`57040`)

pandas/_libs/src/parser/tokenizer.c

+9
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ void parser_set_default_options(parser_t *self) {
109109

110110
parser_t *parser_new(void) { return (parser_t *)calloc(1, sizeof(parser_t)); }
111111

112+
static void parser_clear_data_buffers(parser_t *self) {
113+
free_if_not_null((void *)&self->stream);
114+
free_if_not_null((void *)&self->words);
115+
free_if_not_null((void *)&self->word_starts);
116+
free_if_not_null((void *)&self->line_start);
117+
free_if_not_null((void *)&self->line_fields);
118+
}
119+
112120
static void parser_cleanup(parser_t *self) {
113121
// XXX where to put this
114122
free_if_not_null((void *)&self->error_msg);
@@ -119,6 +127,7 @@ static void parser_cleanup(parser_t *self) {
119127
self->skipset = NULL;
120128
}
121129

130+
parser_clear_data_buffers(self);
122131
if (self->cb_cleanup != NULL) {
123132
self->cb_cleanup(self->source);
124133
self->cb_cleanup = NULL;

0 commit comments

Comments
 (0)