tl; dr: Я хочу предсказать завершение копирования файла. Каковы хорошие методы, учитывая время начала и текущий прогресс?
Во-первых, я знаю, что это совсем не простая проблема, и предсказать будущее трудно. В контексте я пытаюсь предсказать завершение длинной копии файла.
Текущий подход:
В настоящий момент я использую довольно наивную формулу, которую я придумал сам: (ETC означает приблизительное время завершения)
ETC = currTime + elapsedTime * (totalSize - sizeDone) / sizeDone
Это работает в предположении, что оставшиеся файлы, которые будут скопированы, будут делать это со средней скоростью копирования до сих пор, что может быть или не быть реалистичным предположением (здесь речь идет о ленточных архивах).
- PRO: ETC будет постепенно меняться и становится все более и более точным, когда процесс близится к завершению.
- CON: Он не очень хорошо реагирует на неожиданные события, такие как скопированная копия файла или быстрое ускорение.
Другая идея:
Следующей идеей, которую я имел, было сохранение записи о прогрессе за последние n секунд (или минут, учитывая, что эти архивы должны занимать часы), и просто выполните что-то вроде:
ETC = currTime + currAvg * (totalSize - sizeDone)
Это нечто противоположное первому методу:
- PRO: Если скорость быстро изменится, ETC будет быстро обновляться, чтобы отразить текущее состояние дел.
- CON: ETC может сильно перескакивать, если скорость несовместима.
Наконец
Мне напоминают о предметах управления, которые я делал в uni, где цель состоит в том, чтобы попытаться получить систему, которая быстро реагирует на внезапные изменения, но не является неустойчивой и сумасшедшей.
С учетом сказанного, другим вариантом, о котором я мог думать, было бы рассчитать среднее значение обоих из вышеперечисленного, возможно, с каким-то взвешиванием:
- Вес более первого метода больше, если копия имеет довольно стабильную среднюю среднюю скорость, даже если она локально перескакивает локально.
- Увеличьте второй способ, если скорость копирования непредсказуема и, вероятно, будет делать такие вещи, как ускорение/замедление в течение длительного времени или вообще прекращение в течение длительного времени.
Я действительно прошу:
- Любые альтернативные подходы к двум, которые я дал.
- Если и как вы могли бы объединить несколько разных методов, чтобы получить окончательное предсказание.