docs: def cache_factor(self, col_list, refresh=False):
          """
          Existing todos here are: these should be hidden helper carrays
          As in: not normal columns that you would normally see as a user
  
          The factor (label index) carray is as long as the original carray
          (and the rest of the table therefore)
          But the (unique) values carray is not as long (as long as the number
          of unique values)
  
          :param col_list:
          :param refresh:
          :return:
          """
  
          if not self.rootdir:
              raise TypeError('Only out-of-core ctables can have '
                              'factorization caching at the moment')
  
          if not isinstance(col_list, list):
              col_list = [col_list]
  
          if refresh:
              kill_list = [x for x in os.listdir(self.rootdir) if '.factor' in x or '.values' in x]
              for kill_dir in kill_list:
                  rm_file_or_dir(os.path.join(self.rootdir, kill_dir))
  
          for col in col_list:
  
              # create cache if needed
              if refresh or not self.cache_valid(col):
                  # todo: also add locking mechanism here
  
                  # create directories
                  col_rootdir = self[col].rootdir
                  col_factor_rootdir = col_rootdir + '.factor'
                  col_factor_rootdir_tmp = tempfile.mkdtemp(prefix='bcolz-')
                  col_values_rootdir = col_rootdir + '.values'
                  col_values_rootdir_tmp = tempfile.mkdtemp(prefix='bcolz-')
  
                  # create factor
                  carray_factor = \
                      bcolz.carray([], dtype='int64', expectedlen=self.size,
                                   rootdir=col_factor_rootdir_tmp, mode='w')
                  _, values = \
                      ctable_ext.factorize(self[col], labels=carray_factor)
                  carray_factor.flush()
  
                  rm_file_or_dir(col_factor_rootdir, ignore_errors=True)
                  shutil.move(col_factor_rootdir_tmp, col_factor_rootdir)
  
                  # create values
                  carray_values = \
                      bcolz.carray(np.fromiter(values.values(), dtype=self[col].dtype),
                                   rootdir=col_values_rootdir_tmp, mode='w')
                  carray_values.flush()
                  rm_file_or_dir(col_values_rootdir, ignore_errors=True)
                  shutil.move(col_values_rootdir_tmp, col_values_rootdir)