Оценка времени ожидания загрузки/прогнозирования
Мы все потрудились в диалоговом окне "Х минут осталось", которое кажется слишком упрощенным, но как мы можем его улучшить?
Фактически, ввод представляет собой набор скоростей загрузки до текущего времени, и мы должны использовать это для оценки времени завершения, возможно, с указанием достоверности, например, "20-25 минут", используя некоторый Y% доверительный интервал.
Код, который сделал это, можно было бы положить в маленькую библиотеку и использовать в проектах по всему, так ли это действительно так сложно? Как бы вы это сделали? Какое весовое отношение вы придадите предыдущим скоростям загрузки?
Или уже есть какой-то открытый исходный код?
Изменить: Обобщение:
- Улучшить расчетное время завершения с помощью лучшего алгоритма/фильтра и т.д.
- Предоставить интервал вместо одного времени ('1h45-2h30 mins') или просто ограничить точность (около 2 часов).
- Укажите, когда прогресс застопорился - хотя, если прогресс последовательно останавливается, а затем продолжается, мы сможем справиться с этим. Возможно, "около 2 часов, в настоящее время заглох"
Ответы
Ответ 1
В более общем плане, я думаю, вы ищете способ мгновенного обмена скоростью передачи, который обычно получается в среднем за небольшой период.
Обычно проблема заключается в том, что для того, чтобы быть реактивной, период обычно чрезвычайно мал, что приводит к эффекту yoyo.
Я бы предложил очень простую схему, пусть моделирует ее.
Подумайте о скорости кривой (y) с течением времени (x).
-
Мгновенная скорость - это не более чем чтение y для текущего x (x0).
-
Средняя скорость, не более Integral(f(x), x in [x0-T,x0]) / T
-
предлагаемая мной схема - применить фильтр, чтобы придать больший вес последним моментам, все еще принимая во внимание прошлые моменты.
Его легко реализовать как g(x,x0,T) = 2 * (x - x0) + 2T
, который является простым треугольником поверхности T.
И теперь вы можете вычислить Integral(f(x)*g(x,x0,T), x in [x0-T,x0]) / T
, который должен работать, потому что обе функции всегда положительны.
Конечно, у вас может быть другой g
, если он всегда положителен в данном интервале и что его интеграл на интервале равен T (так что его собственное среднее равно точно 1).
Преимущество этого метода состоит в том, что, поскольку вы придаете больше веса непосредственным событиям, вы можете оставаться довольно реактивным, даже если вы рассматриваете большие интервалы времени (чтобы среднее значение было более точным и менее восприимчивым к икотам).
Кроме того, то, что я редко видел, но думаю, предоставил бы более точные оценки, было бы сопоставить время, затрачиваемое на вычисление среднего значения до расчетного оставшегося времени:
- Если я скачу файл 5ko, он будет загружен в одно мгновение, не нужно оценивать
- Если я загружу файл 15 Mo, это займет примерно 2 минуты, поэтому я бы хотел, чтобы оценки... каждые 5 секунд?
- если я загружу файл 1.5 Go, он будет принимать... ну около 200 минут (с той же скоростью)... то есть 3h20m... возможно, что оценок каждую минуту будет достаточно?
Итак, чем дольше будет загружаться загрузка, тем менее реакционно я должен быть, и чем больше я могу уснуть. В общем, я бы сказал, что окно может охватывать 2% от общего времени (возможно, за исключением нескольких первых оценок, потому что люди ценят немедленную обратную связь). Кроме того, достаточно указать прогресс всего% за раз. Если задача длинная, я все равно готов ждать.
Ответ 2
Интересно, применит ли метод оценки состояния здесь хорошие результаты? Что-то вроде фильтра Калмана?
В основном вы прогнозируете будущее, просматривая свою текущую модель и меняя модель на каждом временном шаге, чтобы отразить изменения в реальном мире. Я думаю, что этот метод используется для оценки времени, оставшегося на вашей батарее ноутбука, которое также может меняться в зависимости от использования, возраста батареи и т.д.
см. http://en.wikipedia.org/wiki/Kalman_filter для более подробного описания алгоритма.
Фильтр также дает меру дисперсии, которая может использоваться для указания вашей уверенности в оценке (хотя, как уже упоминалось в других ответах, возможно, не лучшая идея показать это конечному пользователю)
Кто-нибудь знает, действительно ли это используется где-то для загрузки (или копирования файлов)?
Ответ 3
Не путайте пользователей, предоставляя больше информации, чем нужно. Я думаю о доверительном интервале. Пропустите его.
Время загрузки Интернета сильно варьируется. Микроволновая печь вмешивается в WiFi. Использование зависит от времени суток, дня недели, праздников и выпусков новых захватывающих игр. Прямо сейчас сервер может быть загружен. Если вы переносите свой ноутбук в кафе, результаты будут разными, чем дома. Таким образом, вы, вероятно, не можете полагаться на исторические данные, чтобы предсказать будущее скорости загрузки.
Если вы не можете точно оценить оставшееся время, не лгите вашему пользователю, предложив такую оценку.
Если вы знаете, сколько данных необходимо загрузить, вы можете предоставить% завершенного прогресса.
Если вы вообще не знаете, предоставить "heartbeat" - часть движущегося пользовательского интерфейса, которая показывает пользователю, что все работает, даже через то, что вы не знаете, сколько времени осталось.
Ответ 4
Улучшение самого расчетного времени: интуитивно я предполагаю, что скорость сетевого соединения представляет собой серию случайных значений вокруг некоторой временной средней скорости - вещи гаснут на одной скорости, а затем внезапно замедляются или ускоряются.
Таким образом, одним из вариантов может быть взвешивание предыдущего набора скоростей с помощью некоторой экспоненты, так что самые последние значения получают самый сильный вес. Таким образом, поскольку предыдущая средняя скорость движется дальше в прошлое, ее влияние на текущее среднее уменьшает.
Однако, если скорость случайным образом колеблется, возможно, стоит сгладить верхнюю часть экспоненты (например, используя гауссовский фильтр ), чтобы избежать слишком больших колебаний.
Итак, я собираюсь измерить стандартное отклонение (возможно, ограничено последними N минутами) и использовать это для создания фильтра Гаусса, который применяется к входам, а затем ограничивает цитируемую точность с помощью стандартного отклонения.
Как бы вы ограничили расчет стандартного отклонения до последних N минут? Как вы знаете, как долго использовать?
В качестве альтернативы существуют возможности распознавания образов, чтобы определить, достиг ли мы стабильной скорости.
Ответ 5
Я подумал об этом и сам. Ответ начинается с сохранения консервативности при вычислении текущей (и, следовательно, будущей) скорости передачи и включает усреднение в течение более длительных периодов, чтобы получить более стабильные оценки. Возможно, низкочастотный фильтр отображает время, которое отображается, так что вы не получаете переходы между 2 минутами и 2 днями.
Я не думаю, что доверительный интервал будет полезен. Большинство людей не смогут его интерпретировать, и это будет просто отображать больше вещей, которые можно угадать.