class_docstr: Hold all parsed data to serve for user requests.
class_docstr_tok: ["Hold","all","parsed","data","to","serve","for","user","requests","."]
code: def get_memory_devices(self):
      if not self.memory_parser:
          return
      data = []
      for device in self.memory_curve.keys():
          data.append(
              {
                  "device": device,
                  "min_size": format_memory(
                      self.size_ranges[device][0], "KB"
                  ),
                  "max_size": format_memory(
                      self.size_ranges[device][1], "KB"
                  ),
                  "max_allocation_size": format_memory(
                      self.peak_allocation_values[device], "KB"
                  ),
              }
          )
      return data
  
imports: from collections import defaultdict
  from collections import OrderedDict
  from .parser.distributed_parser import DistributedParser
  from .parser.kernel_parser import KernelParser
  from .parser.memory_parser import MemoryParser
  from .parser.operator_parser import OperatorParser
  from .parser.overview_parser import CPUType
  from .parser.overview_parser import GPUType
  from .parser.overview_parser import OverviewParser
  from .parser.trace_parser import TraceParser
  from .parser.utils import format_float
  from .parser.utils import format_memory
  from .parser.utils import format_ratio
  from .parser.utils import format_time
  from .parser.utils import traverse_tree
label_desc: Use image node_id 16 for calling the ProfilerData obj's underlying member method code with example usage: obj.get_memory_devices() and returns: data