Invoked from the C level, this function will return either the name of
        the folder where the datatable is to be saved; or None, indicating that
        the datatable should be read into RAM. This function may also raise an
        exception if it determines that it cannot find a good strategy to
        handle a dataset of the requested size.

def _get_destination(self, estimated_size):
        """
        Invoked from the C level, this function will return either the name of
        the folder where the datatable is to be saved; or None, indicating that
        the datatable should be read into RAM. This function may also raise an
        exception if it determines that it cannot find a good strategy to
        handle a dataset of the requested size.
        """
        global _psutil_load_attempted
        if not _psutil_load_attempted:
            _psutil_load_attempted = True
            try:
                import psutil
            except ImportError:
                psutil = None

        if self.verbose and estimated_size > 1:
            self.logger.debug("The Frame is estimated to require %s bytes"
                              % humanize_bytes(estimated_size))
        if estimated_size < 1024 or psutil is None:
            return None
        vm = psutil.virtual_memory()
        if self.verbose:
            self.logger.debug("Memory available = %s (out of %s)"
                              % (humanize_bytes(vm.available),
                                 humanize_bytes(vm.total)))
        if (estimated_size < vm.available and self._save_to is None or
                self._save_to == "memory"):
            if self.verbose:
                self.logger.debug("Frame will be loaded into memory")
            return None
        else:
            if self._save_to:
                tmpdir = self._save_to
                os.makedirs(tmpdir)
            else:
                tmpdir = tempfile.mkdtemp()
            du = psutil.disk_usage(tmpdir)
            if self.verbose:
                self.logger.debug("Free disk space on drive %s = %s"
                                  % (os.path.splitdrive(tmpdir)[0] or "/",
                                     humanize_bytes(du.free)))
            if du.free > estimated_size or self._save_to:
                if self.verbose:
                    self.logger.debug("Frame will be stored in %s"
                                      % tmpdir)
                return tmpdir
        raise RuntimeError("The Frame is estimated to require at lest %s "
                           "of memory, and you don't have that much available "
                           "either in RAM or on a hard drive."
                           % humanize_bytes(estimated_size))