Подтвердить что ты не робот

Как оценить оставшееся время загрузки (точно)?

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

4b9b3361

Ответ 1

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

enter image description here

Толстая синяя линия в этом примере диаграммы - это фактическая пропускная способность во времени. Обратите внимание на низкую пропускную способность в течение первой половины передачи, а затем она резко возрастает во второй половине. Оранжевая линия - это общее среднее значение. Обратите внимание, что он никогда не подстраивается достаточно далеко, чтобы дать точный прогноз того, сколько времени потребуется, чтобы закончить. Серая линия - это скользящее среднее (т.е. Среднее из последних N точек данных - на этом графике N равно 5, но на самом деле N может потребоваться увеличить для достаточного сглаживания). Он восстанавливается быстрее, но все еще требует времени для настройки. Это займет больше времени, чем больше N. Так что если ваши данные довольно шумные, то N должно быть больше, а время восстановления будет больше.

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

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

Еще один важный совет: разработчики обычно игнорируют время настройки и завершения в своих индикаторах выполнения и расчетах оценки времени. Это приводит к вечному индикатору выполнения на 99% или 100%, который просто сидит там в течение длительного времени (во время очистки кэшей или выполнения другой работы по очистке), или к предварительным оценкам, когда происходит сканирование каталогов или другая работа по настройке, накапливается время. но не получая никакого процента прогресса, который отбрасывает все. Вы можете запустить несколько тестов, которые включают в себя время установки и разборки, и оценить, сколько времени в среднем это время или на основе размера задания, и добавить это время в индикатор выполнения. Например, первые 5% работы - это работа по настройке, а последние 10% - это работа по разборке, а затем 85% в середине - это загрузка или повторяющийся процесс отслеживания. Это тоже может помочь.

Ответ 2

экспоненциальная скользящая средняя отлично подходит для этого. Это дает возможность сгладить среднее значение, так что каждый раз, когда вы добавляете новый образец, более старые образцы становятся все более важными для общего среднего. Они по-прежнему считаются, но их значение снижается экспоненциально - отсюда и название. И поскольку это "движущееся" среднее значение, вам нужно сохранить только один номер.

В контексте измерения скорости загрузки формула будет выглядеть так:

averageSpeed = SMOOTHING_FACTOR * lastSpeed + (1-SMOOTHING_FACTOR) * averageSpeed;

SMOOTHING_FACTOR - это число от 0 до 1. Чем выше это число, тем быстрее старые образцы отбрасываются. Как вы можете видеть в формуле, когда SMOOTHING_FACTOR равно 1, вы просто используете значение своего последнего наблюдения. Когда SMOOTHING_FACTOR равно 0 averageSpeed никогда не изменяется. Таким образом, вы хотите что-то среднее между ними и, как правило, низкое значение, чтобы получить достойное сглаживание. Я обнаружил, что 0.005 обеспечивает довольно хорошее значение сглаживания для средней скорости загрузки.

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

averageSpeed - это, очевидно, номер, который вы хотите использовать для расчета вашего предполагаемого времени. Инициализируйте это до первого измерения lastSpeed, которое вы получите.

Ответ 3

speed=speedNow*0.5+speedLastHalfMinute*0.3+speedLastMinute*0.2

Ответ 4

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

Ответ 5

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

Что-то вроде этого:

prediction = 50;
depencySpeed = 200;
stableFactor = .5;
smoothFactor = median(0, abs(lastSpeed - averageSpeed), depencySpeed);
smoothFactor /= (depencySpeed - prediction * (smoothFactor / depencySpeed));
smoothFactor = smoothFactor * (1 - stableFactor) + stableFactor;
averageSpeed = smoothFactor * lastSpeed + (1 - smoothFactor) * averageSpeed;

Флуктуация или нет, она будет как стабильной, так и другой, с правильными значениями для предсказания и depencySpeed; вам нужно немного поиграть с ним в зависимости от скорости вашего интернета. Эти настройки идеально подходят для скорости передачи 600 кБ/с, в то время как она колеблется от 0 до 1 МБ.

Ответ 6

Я нашел ответ Бена Долмана очень полезным, но для такого, как я, который не настолько склонен к математике, мне потребовалось около часа, чтобы полностью реализовать это в моем коде. Вот более простой способ сказать то же самое в python, если есть какие-либо неточности, дайте мне знать, но в моем тестировании это работает очень хорошо:

def exponential_moving_average(data, samples=0, smoothing=0.02):
    '''
    data: an array of all values.
    samples: how many previous data samples are avraged. Set to 0 to average all data points.
    smoothing: a value between 0-1, 1 being a linear average (no falloff).
    '''

    if len(data) == 1:
        return data[0]

    if samples == 0 or samples > len(data):
        samples = len(data)

    average = sum(data[-samples:]) / samples
    last_speed = data[-1]
    return (smoothing * last_speed) + ((1 - smoothing) * average)

input_data = [4.5, 8.21, 8.7, 5.8, 3.8, 2.7, 2.5, 7.1, 9.3, 2.1, 3.1, 9.7, 5.1, 6.1, 9.1, 5.0, 1.6, 6.7, 5.5, 3.2] # this would be a constant stream of download speeds as you go, pre-defined here for illustration

data = []
ema_data = []

for sample in input_data:
    data.append(sample)
    average_value = exponential_moving_average(data)
    ema_data.append(average_value)

# print it out for visualization
for i in range(len(data)):
    print("REAL: ", data[i])
    print("EMA:  ", ema_data[i])
    print("--")