code: def _read_all_values(self):
          
  
          pos = 8
  
          # cache variables to local ones and prevent attributes lookup
          # on every loop iteration
          used = self._used
          data = self._m
          unpack_from = struct.unpack_from
  
          while pos < used:
              encoded_len = _unpack_integer(data, pos)[0]
              # check we are not reading beyond bounds
              if encoded_len + pos > used:
                  msg = 'Read beyond file size detected, %s is corrupted.'
                  raise RuntimeError(msg % self._fname)
              pos += 4
              encoded = unpack_from(('%ss' % encoded_len).encode(), data, pos)[0]
              padded_len = encoded_len + (8 - (encoded_len + 4) % 8)
              pos += padded_len
              value = _unpack_double(data, pos)[0]
              yield encoded.decode('utf-8'), value, pos
              pos += 8
docs: Yield (key, value, pos). No locking is performed.