【问题标题】:Algo for a stable 'download-time-remaining' in a download window在下载窗口中稳定“剩余下载时间”的算法
【发布时间】:2009-11-24 06:45:06
【问题描述】:

在窗口中显示下载状态时,我有如下信息:

1) 总文件大小 (f)

2) 下载文件大小 (f')

3) 当前下载速度(秒)

一个简单的剩余时间计算是 (f-f')/(s),但这个值很不稳定(剩余 6m / 剩余 2h / 剩余 5m!似曾相识?!:)

会不会有一个既稳定又不会出错的计算(即使下载即将完成也显示1h)?

【问题讨论】:

  • 我不相信平滑平均会削减它;我看过我的 Ubuntu 更新下载了一半的文件,我注意到一个非常清晰的模式 - 较大的文件平均速度比较小的文件快得多(高达 5 倍甚至有时甚至 10 倍)。如果您确实对正在使用的协议(例如 ftp、http)做出假设,那么您应该能够推断出为什么会发生这种变化(请注意,由于涉及到所有细节,这并不容易,但也不是不可能的)。基本上,随着时间的推移,我会尝试改进预测下载速度和时间作为大小函数的函数。

标签: algorithm math


【解决方案1】:

我们通过以下方式解决了类似的问题。我们对整个时间内的下载速度不感兴趣,只是根据最近的活动大致预计需要多长时间,但正如你所说,不是最近的数字到处乱跳。

我们对整个时间范围不感兴趣的原因是,下载可能会在半小时内达到 1M/s,然后在接下来的 10 分钟内切换到 10M/s。前半小时会严重拖慢平均速度,尽管您现在正在以相当快的速度鸣喇叭。

我们创建了一个循环缓冲区,每个单元格保存 1 秒内的下载量。循环缓冲区大小为 300,允许 5 分钟的历史数据,并且每个单元格都初始化为零。

我们还维护了一个总数(缓冲区中所有条目的总和,因此最初也是零)和计数(显然是零)。

每一秒,我们都会计算出自上一秒以来下载了多少数据,然后:

  • 从总数中减去当前单元格。
  • 将当前图形放入该单元格并推进单元格指针。
  • 将当前数字加到总数中。
  • 如果还不是 300,则增加计数。
  • 根据总数/计数更新显示给用户的数字。

基本上,在伪代码中:

def init (sz):
    buffer = new int[sz]
    for i = 0 to sz - 1:
        buffer[i] = 0 
    total = 0
    count = 0
    index = 0
    maxsz = sz

def update (kbps):
    total = total - buffer[index] + kbps
    buffer[index] = kbps
    index = (index + 1) % maxsz
    if count < maxsz:
        count = count + 1
    return total / count

您可以根据自己的情况更改分辨率(1 秒)和历史记录(300),但我们发现 5 分钟的时间已经足够长,可以消除不规则之处,但仍会及时逐渐适应更永久的变化。

【讨论】:

  • 不应该是:count = min (maxsz, count + 1) ?
  • @phix23: 很好。我不敢相信过去 年没有人注意到这一点。 Annhoo,我已经对其进行了修改以使其正常工作并完全消除了对函数的依赖。
  • 我也不敢相信,也许我是第一个真正使用这个代码的人
【解决方案2】:

Smooth s(exponential moving avg. 或类似)。

【讨论】:

  • 这实际上只是低通滤波器。
【解决方案3】:

我更喜欢使用最后 10 秒的平均速度,然后除以剩余部分。划分为当前速度太不稳定,而划分为整个进度的平均值无法处理永久的速度变化(就像另一个下载正在开始)。

【讨论】:

    【解决方案4】:

    为什么不将下载速度计算为整个下载的平均值,即:

    s = f' / elapsed time
    

    这样它会随着时间的推移而变得平滑。

    【讨论】:

    • 以 100kb/s 的速度下载一个小时,你下载了 50%。然后你开始另一个下载并且速度下降了 50kb/s 你的下载时间指示器将是错误的,直到你的下载结束。它会说还剩 30 分钟,而显然需要我们才能下载其余部分。
    • 实际上,您根本无法预测第二次下载需要多长时间。第二次下载总共可能需要 50KB。在这种情况下,您会在 8 秒内显示剩余 1 小时,之后它会反弹到 30 分钟。预测很难,尤其是在谈到未来时:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多