Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changelog/991.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed a memory leak when deep-copying an ``NDCube`` object or its coordinates by properly implementing ``__deepcopy__`` for ``ExtraCoords`` and ``GlobalCoords``.
13 changes: 13 additions & 0 deletions ndcube/extra_coords/extra_coords.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import abc
import copy
from collections.abc import Iterable
from functools import partial, reduce
from numbers import Integral
Expand Down Expand Up @@ -155,6 +156,18 @@ def __init__(self, ndcube=None):
# We need a reference to the parent NDCube
self._ndcube = ndcube

def __deepcopy__(self, memo):

cls = self.__class__
result = cls.__new__(cls)
memo[id(self)] = result
for k, v in self.__dict__.items():
if k == '_ndcube':
setattr(result, k, None)
else:
setattr(result, k, copy.deepcopy(v, memo))
return result

@classmethod
def from_lookup_tables(cls, names, pixel_dimensions, lookup_tables, physical_types=None):
"""
Expand Down
12 changes: 12 additions & 0 deletions ndcube/global_coords.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,18 @@ def __init__(self, ndcube=None):
self._ndcube = ndcube
self._internal_coords = OrderedDict()

def __deepcopy__(self, memo):

cls = self.__class__
result = cls.__new__(cls)
memo[id(self)] = result
for k, v in self.__dict__.items():
if k == '_ndcube':
setattr(result, k, None)
else:
setattr(result, k, copy.deepcopy(v, memo))
return result

@staticmethod
def _convert_dropped_to_internal(dropped_dimensions):
"""
Expand Down
Loading