diff --git a/c/CHANGELOG.rst b/c/CHANGELOG.rst index 4a5ea3785f..f556e01378 100644 --- a/c/CHANGELOG.rst +++ b/c/CHANGELOG.rst @@ -40,6 +40,9 @@ - Add ``edge`` attribute to ``mutation_t`` struct make available in tree sequence. (:user:`jeromekelleher`, :issue:`685`, :pr:`2279`) +- Reduce peak memory usage in ``tsk_treeseq_simplify``. + (:user:`jeromekelleher`, :issue:`2287`, :pr:`2288`) + ---------------------- [0.99.15] - 2021-12-07 ---------------------- diff --git a/c/tskit/trees.c b/c/tskit/trees.c index eff547d3b8..e5e230ccec 100644 --- a/c/tskit/trees.c +++ b/c/tskit/trees.c @@ -3227,20 +3227,29 @@ tsk_treeseq_simplify(const tsk_treeseq_t *self, const tsk_id_t *samples, tsk_id_t *node_map) { int ret = 0; - tsk_table_collection_t tables; + tsk_table_collection_t *tables = tsk_malloc(sizeof(*tables)); - ret = tsk_treeseq_copy_tables(self, &tables, 0); + if (tables == NULL) { + ret = TSK_ERR_NO_MEMORY; + goto out; + } + ret = tsk_treeseq_copy_tables(self, tables, 0); if (ret != 0) { goto out; } - ret = tsk_table_collection_simplify( - &tables, samples, num_samples, options, node_map); + ret = tsk_table_collection_simplify(tables, samples, num_samples, options, node_map); if (ret != 0) { goto out; } - ret = tsk_treeseq_init(output, &tables, TSK_TS_INIT_BUILD_INDEXES); + ret = tsk_treeseq_init( + output, tables, TSK_TS_INIT_BUILD_INDEXES | TSK_TAKE_OWNERSHIP); + /* Once tsk_tree_init has returned ownership of tables is transferred */ + tables = NULL; out: - tsk_table_collection_free(&tables); + if (tables != NULL) { + tsk_table_collection_free(tables); + tsk_safe_free(tables); + } return ret; }