class_docstr: Same as DataLoader except it uses torch-based shuffling buffers which enable batched buffering
  (significantly faster for small data).
code: def _yield_batches(self, keys):
      while self._shuffling_buffer.can_retrieve():
          batch = self._shuffling_buffer.retrieve()
          if not isinstance(batch, dict):
              # This is for the case of batched reads. Here we restore back the
              # dictionary format of records
              batch = dict(zip(keys, batch))
          yield batch
  
imports: import collections.abc
  import decimal
  import re
  import logging
  import numpy
  from six import PY2
  from torch.utils.data.dataloader import default_collate
  import torch
  from packaging import version
  from petastorm.reader_impl.shuffling_buffer import RandomShufflingBuffer, NoopShufflingBuffer
  from petastorm.reader_impl.pytorch_shuffling_buffer import BatchedRandomShufflingBuffer, BatchedNoopShufflingBuffer
label_desc: Use image node_id 3 for calling the BatchedDataLoader obj's underlying member method code with example usage: obj._yield_batches(keys) without return types