class_docstr: Similar to :class:`MapDataComponent`, but perform IPC by shared memory,
  therefore more efficient when data (result of map_func) is large.
  It requires `map_func` to always return a numpy array of fixed shape and dtype, or None.
code: def __iter__(self):
      ds_itr = _repeat_iter(self.ds.get_data)
      with self._guard:
          while True:
              dps = []
              for k in range(self.nr_proc):
                  dps.append(copy.copy(next(ds_itr)))
              to_map = [x[self.index] for x in dps]
              res = self._pool.map_async(_pool_map, to_map)
  
              for index in res.get():
                  if index is None:
                      continue
                  arr = np.reshape(
                      self._shared_mem[index], self.output_shape
                  )
                  dp = dps[index]
                  dp[self.index] = arr.copy()
                  yield dp
  
imports: import copy
  import ctypes
  import multiprocessing
  import numpy
  import threading
  import zmq
  from six.moves import queue
  from ..utils.concurrency import StoppableThread, enable_death_signal
  from ..utils.serialize import dumps_once, loads_once
  from .base import DataFlow, DataFlowReentrantGuard, ProxyDataFlow
  from .common import RepeatedData, BatchData
  from .parallel import _bind_guard, _get_pipe_name, _MultiProcessZMQDataFlow, _repeat_iter, _zmq_catch_error
label_desc: Use image node_id 5 for calling the MultiProcessMapDataComponentSharedArray obj's underlying member method code with example usage: obj.__iter__() without return types