code: def get_spill_keys(self, size: int) -> Tuple[List, List]:
      spill_sizes = []
      spill_keys = []
      spill_size = 0
      for data_key, data_size in self._data_sizes.items():
          if spill_size >= size:
              break
          if data_key in self._pinned_keys:
              continue
          if data_key in self._spilling_keys:
              continue
          spill_sizes.append(data_size)
          spill_keys.append(data_key)
          spill_size += data_size
  
      if spill_size < size:  # pragma: no cover
          pinned_sizes = dict(
              (k, self._data_sizes[k]) for k in self._pinned_keys
          )
          spilling_keys = dict(
              (k, self._data_sizes[k]) for k in self._spilling_keys
          )
          logger.debug(
              "No data can be spilled for level: %s, pinned keys: %s,"
              " spilling keys: %s",
              self._level,
              pinned_sizes,
              spilling_keys,
          )
          raise NoDataToSpill(
              f"No data can be spilled for level: {self._level}"
          )
      self._spilling_keys.update(set(spill_keys))
      return spill_sizes, spill_keys
  
imports: import asyncio
  import logging
  from abc import ABC, abstractmethod
  from collections import defaultdict
  from typing import List, Tuple
  from ...None import oscar
  from ...storage import StorageLevel
  from .core import DataManagerActor
  from .errors import NoDataToSpill
  from .handler import StorageHandlerActor
label_desc: Use image node_id 7 for calling the FIFOStrategy obj's underlying member method code with example usage: obj.get_spill_keys(size) and returns: spill_sizes,  spill_keys