代码之家  ›  专栏  ›  技术社区  ›  GONeale

用有限的信息计算总批量上传传输百分比

  •  1
  • GONeale  · 技术社区  · 15 年前

    我有一个系统,它按文件上传到服务器,并在文件上传进度上显示一个进度条,然后在第二个进度条下面,我想指示所有排队上传的文件的批处理完成百分比。

    我能得出的信息和算法有:

    已发送字节数/要发送的总字节数=第一个进度条(例如512KB,1024KB(50%))

    那很好。 然而,假设我还有另外两个文件要上传,但两个文件的大小都是未知的(因为只有在文件即将开始上传时才知道,此时文件已被压缩,文件大小已确定),我将如何开始我的第三个进度条?

    我不认为这是可能的,因为我需要“发送的总字节数/发送的总字节数”来更大规模地复制我的第一个进度条的逻辑,但是我得到了一个可以工作的版本: “当前文件号/要发送的文件总数”返回整个批处理的百分比,但是显然不会增量更新,这相当粗糙。

    因此,进一步考虑,我认为如果我能将当前文件%与此算法结合起来,我也许可以得到批处理当前点的正确进度百分比。

    我试过这个算法,但可惜没有效果(对不起任何一个数学头脑,很明显为什么它不起作用)

    ("Current file number we are on" / "total number of files to send") * ("Bytes Sent" / "Total Bytes To Send")

    例如,当我用这个例子进行测试时,我认为我走在了正确的轨道上:2/3(第三个文件的第二个文件)=66%(目前为止是正确的),但是当我添加*0.20(表示第二个文件只上传了20%)时,我们回到了13%。我只需要33%多一点!我确实在0.80和a(2/3*(2/3*0.2))时尝试了逆运算。

    在不知道要批量上传的整个字节的情况下,可以做到这一点吗?

    请帮忙!谢谢您!

    3 回复  |  直到 15 年前
        1
  •  1
  •   Carl Smotricz    15 年前

    如果您不知道其他排队文件有多大,则无法准确显示与所需时间相关且成比例的百分比值。

    我想到了很多解决办法:

    • 一种看起来你知道但实际上欺骗用户的方法是假设所有排队文件的大小与正在处理的文件相同,或者是目前处理的文件的平均大小。基于此,如果所有文件的大小确实相同,进度条将显示“真相”,如果大小差异很大,进度条将非常关闭。

    • 另一种方法是让第二个进度条不显示传输字节的百分比,而是显示文件的百分比。因此,如果您有4个文件,该条将从0到25%到50%到75%到100%。它不能准确反映所花的时间,但至少你不会说谎。

    • 你可以用微软这样的方法做得更糟:当进度条接近100%时,让它的增长逐渐变慢,这样它就永远不会真正到达终点。所有用户看到的都是不断接近的“几乎完成”的值。这样的显示看起来很酷,但实际上给了用户尽可能少的信息。

        2
  •  1
  •   High Performance Mark    15 年前

    正如@carl所观察到的,如果不知道还有多少要发送,就无法对已经发送的比例做出真实的估计。暂且不谈科学的准确性和完整性,你的计算:

    ("Current file number we are on" / "total number of files to send") * 
    ("Bytes Sent" / "Total Bytes To Send")
    

    应该扩展到包含文件分数的概念。如果你在11个文件中发送了6个文件,在第7个文件中发送了30%,你需要计算

    (6.3 / 11) * ("Bytes Sent" / "Total Bytes To Send")
    

    在这一行的某个地方,你把发送的文件数乘以当前已发送文件的比例 0.66*0.2=0.13 ,而不是添加当前文件的比例。

    重新拾起科学的准确性和完整性,为什么不在第二个进度条上使用传输速率呢?如果你在一个合理的时间段内把它整合起来,它应该给观察者一种令人满意的感觉,即正在发生一些事情,正在取得进展。

        3
  •  0
  •   GONeale    15 年前

    天哪,我没想到最简单的方法:

    (double)((ProcessedFileCount + DecimalBytesTransferred) / TotalFileCount)
    

    (其中processedfilecount始终指示完全传输和完成的文件)

    以及3个文件批的验证测试用例:

    Eg. ((2 + 1.0) / 3) (File 1+2+3: 100%) == batch 100% complete.
    Eg. ((2 + 0.9) / 3) (File 1+2: 100%, File 3: 90%) == batch 96% complete.
    Eg. ((1 + 0.9) / 3) (File 1: 100%, File 2: 90%) == only 63% complete.
    

    好好享受!谢谢你们的意见,不过我会考虑所有的外部建议。