docs: def detect_partition_strategy(bid, delimiters=('/', '-'), prefix=''):
      """Try to detect the best partitioning strategy for a large bucket
  
      Consider nested buckets with common prefixes, and flat buckets.
      """
      account, bucket = bid.split(":", 1)
      region = connection.hget('bucket-regions', bid)
      versioned = bool(int(connection.hget('bucket-versions', bid)))
      size = int(float(connection.hget('bucket-sizes', bid)))
      session = get_session(
          json.loads(connection.hget('bucket-accounts', account)))
      s3 = session.client('s3', region_name=region, config=s3config)
  
      (contents_key,
       contents_method,
       continue_tokens) = BUCKET_OBJ_DESC[versioned]
  
      with bucket_ops(bid, 'detect'):
          keys = set()
          for delimiter in delimiters:
              method = getattr(s3, contents_method, None)
              results = method(
                  Bucket=bucket, Prefix=prefix, Delimiter=delimiter)
              prefixes = [p['Prefix'] for p in results.get('CommonPrefixes', [])]
              contents = results.get(contents_key, [])
              keys.update([k['Key'] for k in contents])
              # If we have common prefixes within limit thresholds go wide
              if (len(prefixes) > 0 and
                  len(prefixes) < 1000 and
                      len(contents) < 1000):
                  log.info(
                      "%s detected prefix delimiter:%s contents:%d prefixes:%d",
                      bid, delimiter, len(contents), len(prefixes))
                  limit = prefix and 2 or 4
                  return process_bucket_partitions(
                      bid, partition=delimiter,
                      strategy='p', prefix_set=prefixes, limit=limit)
  
      # Detect character sets
      charset = get_keys_charset(keys, bid)
      log.info("Detected charset %s for %s", charset, bid)
  
      # Determine the depth we need to keep total api calls below threshold
      scan_count = size / 1000.0
      for limit in range(1, 4):
          if math.pow(len(charset), limit) * 1000 > scan_count:
              break
  
      # Dispatch
      prefixes = ('',)
      prefixes = NGramPartition(
          charset, limit=limit).initialize_prefixes(prefixes)
  
      #
      random.shuffle(prefixes)
  
      # Pregen on ngram means we have many potentially useless prefixes
      # todo carry charset forward as param, and go incremental on prefix
      # ngram expansion
      connection.hincrby('bucket-partition', bid, len(prefixes))
      return bulk_invoke(
          process_bucket_iterator, [bid], prefixes)