2009-12-10 4 views
14

Мы все выдумали в диалоговом окне «Х минут осталось», которое кажется слишком упрощенным, но как мы можем его улучшить?Оценка времени окончания загрузки

Фактически, ввод представляет собой набор скоростей загрузки до текущего времени, и нам необходимо использовать это для оценки времени завершения, возможно, с указанием достоверности, например, «20-25 минут», используя некоторые Y % доверительный интервал.

Код, который сделал это, можно было бы положить в маленькую библиотеку и использовать в проектах по всему, так ли это действительно так сложно? Как бы вы это сделали? Какое весовое отношение вы придадите предыдущим скоростям загрузки?

Или есть какой-то открытый исходный код?

Edit: Подведение итогов:

  1. Улучшение ориентировочного времени завершения с помощью лучшего алго/фильтра и т.д.
  2. Предоставлять интервал вместо одного времени ('1h45-2h30 минут'), или просто ограничить точность («около 2 часов»).
  3. Укажите, когда прогресс застопорился - хотя, если прогресс последовательно останавливается, а затем продолжается, мы сможем справиться с этим. Может быть, «около 2 часов, в настоящее время застопорилось»
+4

обязательной ссылкой XKCD: http://www.xkcd.com/612/ – jason

+0

Дубликат http://stackoverflow.com/questions/933242/smart-progress-bar-eta-computation –

ответ

4

Не путай пользователям, предоставляя больше информации, чем они нуждаются. Я думаю о доверительном интервале. Пропусти это.

Время загрузки в Интернете сильно варьируется. Микроволновая печь вмешивается в WiFi. Использование зависит от времени суток, дня недели, праздников и выпусков новых захватывающих игр. Прямо сейчас сервер может быть загружен. Если вы переносите свой ноутбук в кафе, результаты будут разными, чем дома. Таким образом, вы, вероятно, не можете полагаться на исторические данные, чтобы предсказать будущее скорости загрузки.

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

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

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

+1

А, не-мгновенного, но - почти скорость измерения (последние 5 секунд?) весьма полезна, чтобы сказать, хорошо ли это происходит. Я говорю об этом не потому, что мне не раз приходилось видеть примерные скорости загрузки в диапазоне Tera/Petabyte в секунду :) – Agos

+0

Целью этой вещи является в основном * улучшить * информацию, предоставленную пользователю. Таким образом, не сообщая лжи, что оценка является точной, учитывая чрезмерную точность («24 минуты 4,2 секунды»), не говоря о том, что она не будет изменяться, если дать единое значение вместо интервала и т. Д. Конечно, если оценщик найдет входы слишком переменные, это может указывать на это. –

0

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

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

+0

Я думаю, что простая индикация доверия будет работать, например, «20-25 минут». По крайней мере, стоило бы ограничить точность поставляемого значения - «около 2 часов» вместо «2 часа 16 минут». –

8

Интересно, будет ли техническая оценка состояния здесь хорошими результатами? Что-то вроде фильтра Калмана?

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

см. http://en.wikipedia.org/wiki/Kalman_filter для более подробного описания алгоритма.

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

Кто-нибудь знает, действительно ли это используется где-то для загрузки (или копирования файлов)?

+0

Калман требует, чтобы вы предоставили ему модель, она не построила ее. Он просто использует ту модель, которую вы ей даете, и шумные измерения, чтобы попытаться выяснить текущее (скрытое) состояние. –

+0

Конечно, вам нужна модель, вы можете начать с простой, где вы предполагаете, что скорость загрузки постоянна, и фильтр будет адаптировать значение скорости загрузки в соответствии с доказательствами. – Yair

12

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

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

Я бы предложил очень простую схему, давайте ее смоделировать.

Подумайте о скорости кривой (y) с течением времени (x).

  1. Мгновенная скорость, не более, чем чтение y для текущего x (x0).

  2. Средняя скорость, не более, чем Integral(f(x), x in [x0-T,x0])/T

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

Это можно легко реализовать, как g(x,x0,T) = 2 * (x - x0) + 2T которая является простой треугольник поверхности Т.

И теперь вы можете вычислить 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% от общего времени (возможно, за исключением нескольких первых оценок, потому что люди ценят немедленную обратную связь). Кроме того, достаточно указать прогресс всего% за раз. Если задача длинная, я все равно готов был ждать.

+3

Отлично, но интеграл, вероятно, перегружен. Давайте просто назовите это средневзвешенное количество нескольких недавних образцов. :-) –

+4

@ Konrad: правда, это было для математической строгости, и фактические реализации поощряются к его приближению ^^ –

2

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

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

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

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

Как бы вы ограничили расчет стандартного отклонения до последних N минут? Как вы знаете, как долго использовать?

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

Смежные вопросы