code: def _get_split_tasks(args, split_fn, file_key, outfile_i=-1):
      
      split_args = []
      combine_map = {}
      finished_map = collections.OrderedDict()
      extras = []
      for data in args:
          out_final, out_parts = split_fn(data)
          for parts in out_parts:
              split_args.append([utils.deepish_copy(data)] + list(parts))
          for part_file in [x[outfile_i] for x in out_parts]:
              combine_map[part_file] = out_final
          if len(out_parts) == 0:
              if out_final is not None:
                  if out_final not in finished_map:
                      data[file_key] = out_final
                      finished_map[out_final] = [data]
                  else:
                      extras.append([data])
              else:
                  extras.append([data])
      return split_args, combine_map, list(finished_map.values()), extras
docs: Split up input files and arguments, returning arguments for parallel processing.
  
      outfile_i specifies the location of the output file in the arguments to
      the processing function. Defaults to the last item in the list.