计算剩余下载时间的最佳方法是什么?

Mea*_*eat 14 download

假设您想要计算剩余下载时间,并且您拥有所需的所有信息,即:文件大小,大小,大小,经过的时间,瞬间dl速度等等.你如何计算剩余的dl时间?

当然,直接的方式是:尺寸左/瞬间dl速度,或:(经过的时间/尺寸)*尺寸左.只有第一个会受瞬时速度的偏差影响,后者不能很好地适应速度的变化.

必须是一些更聪明的方法,对吧?查看您目前使用uTorrent下载的盗版软件和音乐.很容易注意到它比以前提到的简单计算更有用.实际上,我注意到有时当dl速度下降时,剩余的时间也会下降一段时间,直到它重新调整为止.

Cha*_*rch 12

好吧,正如你所说,使用绝对当前的下载速度并不是一个好方法,因为它往往会波动.然而,像整体平均值这样的东西也不是一个好主意,因为那里也可能存在很大的波动.

考虑我是否与其他9个人同时开始下载文件.我只获得正常速度的10%,但在文件的中途,另外9个完成.现在我的速度是我开始时的10倍.我最初的10%速度不应该是"剩下多少时间?"的一个因素.再计算.

就个人而言,我可能会在过去30秒左右取平均值,并使用它.这应该根据最近的速度进行计算,而不会大幅波动.30秒可能不是正确的数量,需要一些实验来计算出好的数量.

另一个选择是设置一种"波动阈值",在速度变化超过该阈值之前,您不会进行任何重新计算.例如(随机数,同样需要实验),您可以将阈值设置为10%.然后,如果您以100kb/s的速度下载,则在下载速度变为低于90kb/s或110kb/s之前,不会重新计算剩余时间.如果发生其中一个更改,则重新计算时间并设置新阈值.


Dre*_*ins 10

您可以使用平均算法,其中旧值线性衰减.如果S_n是时间n的速度而A_ {n-1}是时间n-1的平均值,则按如下方式定义平均速度.

A_1 = S_1
A_2 =(S_1 + S_2)/ 2
A_n = S_n /(n-1)+ A_ {n-1}(1-1 /(n-1))

在英语中,这意味着过去测量发生的时间越长,重要性就越小,因为它的重要性已经衰退.

将其与常规平均算法进行比较:A_n = S_n/n + A_ {n-1}(1-1/n)

你也可以让它几何衰减,这会对最近的速度产生很大的影响:A_n = S_n/2 + A_ {n-1}/2

如果速度为4,3,5,6,则A_4 = 4.5(简单平均值)
A_4 = 4.75(线性衰减)
A_4 = 5.125(几何衰减)

PHP中的示例

请注意$n+1(不$n)是由于PHP的数组被零索引而导致的当前数据点的数量.要匹配上面的示例集n == $n+1n-1 == $n

<?php

$s = [4,3,5,6];

// average
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
    if ($n == 0)
        $a[$n] = $s[$n];
    else
    {
        // $n+1 = number of data points so far
        $weight = 1/($n+1);

        $a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
    }
}

var_dump($a);


// linear decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
    if ($n == 0)
        $a[$n] = $s[$n];

    elseif ($n == 1)
        $a[$n] = ($s[$n] + $s[$n-1]) / 2;

    else
    {
        // $n = number of data points so far - 1
        $weight = 1/($n);

        $a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
    }
}

var_dump($a);


// geometric decay
$a = [];
for ($n = 0; $n < count($s); ++$n)
{
    if ($n == 0)
        $a[$n] = $s[$n];
    else
    {
        $weight = 1/2;

        $a[$n] = $s[$n] * $weight + $a[$n-1] * (1 - $weight);
    }
}

var_dump($a);
Run Code Online (Sandbox Code Playgroud)

产量

array (size=4)
  0 => int 4
  1 => float 3.5
  2 => float 4
  3 => float 4.5

array (size=4)
  0 => int 4
  1 => float 3.5
  2 => float 4.25
  3 => float 4.8333333333333

array (size=4)
  0 => int 4
  1 => float 3.5
  2 => float 4.25
  3 => float 5.125
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的一个优点是您不需要保留值列表,而使用移动平均法则可以.这种方法将产生比移动平均值更平滑的曲线,当异常值从平均值下降时,这将对反应更加剧烈. (3认同)
  • @DrewHoskins:谢谢你这个公式.我正在尝试实现这一点,并希望检查我做得对.我拿了你的样本速度值4,3,5,6来检查你给出的结果和我计算的结果.我得到了几何衰减的相同值,但对于线性衰减,我得到了4.8333~A_4.我的错误在哪里?线性衰减:A_1 = 4; A_2 =(4 + 3)/ 2 = 3.5; A_3 = 5 /(3 - 1)+ 3.5*(1 - 1 /(3 - 1))= 4.25; A_4 = 6 /(4-1)+ 4.25*(1-1 /(4-1))= 4.8333 - 几何衰减:A_1 = 4; A_2 =(4 + 3)/ 2 = 3.5; A_3 = 5/2 + 3.5/2 = 4.25; A_4 = 6/2 + 4.25/2 = 5.125 (2认同)

Hen*_*man 7

显而易见的方法是介于两者之间,你需要一个下载速度的"移动平均线".


Óla*_*age 1

您还可以做的是跟踪您的平均速度并显示其计算结果。