class_docstr: Holds (key, binary value) tuples to disk, fast.
  
  Bucket instances are designed to be used either:
    1. Many buckets are written in parallel, then they are read one by one. When
    reading, the data can be fully loaded in memory to be sorted.
    This is how buckets are currently used in Shuffler.
    2. Buckets are being written one at a time (or on different machines/jobs).
    Before writing the data, it is sorted in memory. Many bucket are read in
    parallel.
    This is not currently used, but could be if we decide do parallelize the
    writing of final sharded tfrecord files.
  
  File format (assuming a key of 16 bytes):
    key1 (16 bytes) | size1 (8 bytes) | data1 (size1 bytes) |
    key2 (16 bytes) | size2 (8 bytes) | data2 (size2 bytes) |
    ...
code: def size(self):
      return self._size
  
imports: import math
  import os
  import struct
  from typing import Iterator, List, Optional
  import uuid
  from absl import logging
  import six
  from tensorflow_datasets.core import hashing
  from tensorflow_datasets.core.utils import file_utils
  from tensorflow_datasets.core.utils import type_utils
  from tensorflow_datasets.core.utils.lazy_imports_utils import tensorflow
label_desc: Use image node_id 2 for calling the _Bucket obj's underlying member method code with example usage: obj.size() and returns: self