Каковы хорошие подходы к прогнозированию времени завершения длительного процесса? - PullRequest
15 голосов
/ 06 октября 2011

tl; dr: я хочу предсказать завершение копирования файла. Каковы хорошие методы с учетом времени начала и текущего прогресса?

Во-первых, я осознаю, что это совсем не простая проблема, и что прогнозирование будущего трудно сделать хорошо. Для контекста я пытаюсь предсказать завершение длинной копии файла.

Текущий подход:

В данный момент я использую довольно наивную формулу, которую я придумал сам: (ETC означает предполагаемое время завершения)

ETC = currTime + elapsedTime * (totalSize - sizeDone) / sizeDone

Это работает в предположении, что остальные файлы, которые будут скопированы, будут делать это при средней скорости копирования, которая может быть или не быть реалистичным предположением (здесь речь идет о ленточных архивах).

  • PRO: ETC будет постепенно меняться и становится все более и более точным, когда процесс приближается к завершению.
  • CON: Он не очень хорошо реагирует на непредвиденные события, такие как застревание или ускорение копирования файла.

Другая идея:

Следующая идея, которая у меня возникла, состояла в том, чтобы вести учет прогресса за последние n секунд (или минут, учитывая, что эти архивы должны занимать часы), и просто сделать что-то вроде:

ETC = currTime + currAvg * (totalSize - sizeDone)

Это своего рода противоположность первого метода в этом:

  • PRO: Если скорость меняется быстро, ETC быстро обновится, чтобы отразить текущее состояние дел.
  • CON: ETC может много прыгать, если скорость не согласована.

Наконец

Мне напомнили предметы по технике управления, которые я изучал в универе, цель которых по сути состоит в том, чтобы попытаться получить систему, которая быстро реагирует на внезапные изменения, но не является нестабильной и безумной.

С учетом вышесказанного, другой вариант, о котором я мог бы подумать, - это вычислить среднее из обоих значений, возможно, с использованием некоторого веса:

  • Назовите первый метод больше, если копия имеет достаточно стабильную долгосрочную среднюю скорость, даже если она немного скачет вокруг.
  • Назовите второй метод больше, если скорость копирования непредсказуема и, вероятно, будет выполнять такие вещи, как ускорение / замедление в течение длительных периодов или вообще остановка в течение длительных периодов.

На самом деле я прошу:

  • Любые альтернативные подходы к двум, которые я дал.
  • Если и как вы бы объединили несколько разных методов, чтобы получить окончательный прогноз.

Ответы [ 4 ]

8 голосов
/ 06 октября 2011

Если вы чувствуете, что точность прогноза важна, способ построения прогностической модели заключается в следующем:

  1. собрать некоторые измерения в реальном мире;
  2. разделите их на три непересекающихся набора: обучение , проверка и тест ;
  3. придумали несколько прогностических моделей (у вас уже есть два плюссмешайте) и подгоните их, используя обучающий набор;
  4. проверьте прогнозные характеристики моделей на проверочном наборе и выберите ту, которая работает лучше всего;
  5. используйте набор test для оценки ошибки прогнозирования вне выборки выбранной модели.

Я бы рискнул предположить, что линейная комбинация вашей текущей модели и «среднее значение за последние n секунд» вполне подойдут для рассматриваемой проблемы.Оптимальные веса для линейной комбинации могут быть установлены с использованием линейной регрессии (однострочник в R ).

Отличным ресурсом для изучения статистических методов обучения является Элементы статистического обучения Хасти, Тибширани и Фридмана.Я не могу рекомендовать эту книгу достаточно высоко.

Наконец, ваша вторая идея (среднее за последние n секунд) пытается измерить мгновенную скорость.Более надежный метод для этого может заключаться в использовании фильтра Калмана , цель которого точно такова:

Его цель - использовать наблюдаемые во времени измерения, содержащие шум (случайные изменения) и другие неточности, и приводят к значениям, которые, как правило, ближе к истинным значениям измерений и связанным с ними вычисленным значениям.

Основное преимущество использования фильтра Калмана, а не фиксированного n - второе скользящее окно является адаптивным: оно автоматически будет использовать более длинное окно усреднения, когда измерения значительно больше, чем когда они стабильны.

4 голосов
/ 06 октября 2011

Имхо, плохие реализации ETC широко используются, что позволяет нам посмеяться . Иногда лучше отображать факты, а не оценки, например:

  • 5 из 10 файлов были скопированы
  • 10 из 200 МБ было скопировано

Или отобразите факты и оценки и проясните, что это только оценка. Но я бы не отображал только оценку.

Каждый пользователь знает, что ETC часто совершенно бессмысленны, и тогда трудно различить значимые ETC и бессмысленные ETC, особенно для неопытных пользователей.

3 голосов
/ 06 октября 2011

Здесь нужно учесть две вещи:

  • точная оценка
  • как представить ее пользователю

1.При оценке

Помимо статистического подхода, один простой способ получить хорошую оценку текущей скорости при удалении некоторого шума или пиков - использовать взвешенный подход.

Вы уже экспериментировалив случае скользящего окна идея заключается в том, чтобы взять довольно большое скользящее окно, но вместо простого среднего значения, придавая больший вес более поздним мерам, поскольку они более показательны для эволюции (немного похоже на производную).

Пример. Предположим, у вас есть 10 предыдущих окон (самое последнее x0, самое последнее x9), тогда вы можете вычислить скорость:

Speed = (10 * x0 + 9 * x1 + 8 * x2 + ... + x9) / (10 * window-time) / 55

Если вы правильно оценили вероятную скорость, тогдаВы близки, чтобы получить хорошее примерное время.

2.На презентации

Главное, что здесь следует помнить, это то, что вам нужен приятный пользовательский опыт, а не научный фронт.

Исследования показали, что пользователи очень плохо реагировали на замедлениеи очень позитивно для ускорения.Таким образом, хороший индикатор прогресса / расчетное время должен сначала быть консервативным в представленных оценках (резервируя время для потенциального замедления).

Простой способ получить такой коэффициент - это процентзавершения, которое вы используете для настройки предполагаемого оставшегося времени.Например:

real-completion = 0.4
presented-completion = real-completion * factor(real-completion)

Где factor таково, что factor([0..1]) = [0..1], factor(x) <= x и factor(1) = 1.Например, кубическая функция обеспечивает хорошее ускорение к времени завершения.Другие функции могут использовать экспоненциальную форму 1 - e^x и т. Д. *

3 голосов
/ 06 октября 2011

Я реализовал два разных решения для решения этой проблемы:

  1. ETC для текущей передачи во время запуска основывается на историческом значении скорости. Это значение уточняется после каждой передачи. Во время переноса я вычисляю средневзвешенное значение между историческими данными и данными из текущего переноса, так что чем ближе к концу вы, тем больше веса придается фактическим данным из переноса.

  2. Вместо показа одного ETC показывать диапазон времени. Идея состоит в том, чтобы вычислить ETC из последних 'n' секунд или минут (как ваша вторая идея). Я отслеживаю лучшие и худшие средние значения и вычисляю диапазон возможных ETC. Это немного сбивает с толку, чтобы показывать в графическом интерфейсе, но нормально показывать в приложении командной строки.

...