本xckd cartoon我不知道什麼是提供一個估計將文件複製/移動的用戶的最佳機制的啓發?
上XKCD的ALT標籤內容如下:
他們可能會說「的連接可能丟失,」但它更有趣的事情天真的時間平均給你希望,如果你在附近等1,163小時,它會最終完成。
忽略這個有趣的事實,它是如何在Windows中完成的?其他操作系統如何?有沒有更好的辦法?
本xckd cartoon我不知道什麼是提供一個估計將文件複製/移動的用戶的最佳機制的啓發?
上XKCD的ALT標籤內容如下:
他們可能會說「的連接可能丟失,」但它更有趣的事情天真的時間平均給你希望,如果你在附近等1,163小時,它會最終完成。
忽略這個有趣的事實,它是如何在Windows中完成的?其他操作系統如何?有沒有更好的辦法?
看看my answer to a similar question(以及那裏的其他答案),瞭解如何在Windows資源管理器中估計剩餘時間。
在我看來,只有得到良好的估算方法之一:
請注意,如果您要複製許多文件,第一點可能需要很多工作。這可能就是爲什麼來自微軟的人決定放棄它的原因。您需要確定自己是否值得爲用戶提供更好的估算,從而計算出的額外開銷。
最重要的是我永遠不會顯示秒(只有幾小時和幾分鐘)。我認爲當你坐在那裏等待一分鐘,而計時器跳過10到20秒時,真的很令人沮喪。並始終顯示真實的信息,如:xxx/yyyy MB複製。
我也包括這樣的事情:
if timeLeft > 5h --> Inform user that this might not work properly if timeLeft > 10h --> Inform user that there might be better ways to move the file if timeLeft > 24h --> Abort and check for problems
我也會在所估計的時間而變化太多
如果這不是太複雜,應該有通知用戶一個自動檢查功能,用於檢查進程是否仍然存在,並且每1-10分鐘工作一次(取決於應用程序)。
如果您要複製,說100GB的視頻會發生什麼?它不會發生太多的事情,但它*會發生...... – RCIX 2009-07-20 08:28:06
談到網絡文件副本,最好的辦法是計算要傳輸文件的大小,網絡響應等,我曾經曾經是一個辦法:
連接速度=中國平安和計算往返時間與15千字節的包。
讓我的文件大小,看看,theorically,如果我會用我的連接速度打破它在 15 kb的包需要多少時間服用。
轉移開始後重新計算我的連接速度,並調整將要耗費的時間。
我已經做了一些類似的估計,當一個隊列將是空的時候,考慮到這些項目的入隊速度比入隊更快。我使用最近的N次讀數(時間,隊列大小)進行線性迴歸。
這給了更好的結果不是一個天真的
(bytes_copied_so_far/elapsed_time) * bytes_left_to_copy
elapsedTime
」totalCopied
」totalCopied
除以totalElapsed
以給出每個定時器間隔(本例中爲1000ms)複製的字節數。我們稱這個變量爲「bytesPerSec
」bytesPerSec
並獲得理論上覆制此文件所需的秒數。我們稱這個變量爲remainingTime
remainingTime
減去elapsedTime
並且您對文件複製時間有些準確的計算。我認爲對話應該承認它們的侷限性。這並不煩人,因爲它沒有給出有用的時間估計,這是令人討厭的,因爲它權威地提供了一個明顯無稽之談的估計。
因此,根據目前的利率或平均利率來估算你喜歡的,滾動平均數,丟棄異常值等。取決於將其延遲的事件的操作和典型持續時間,因此,如果知道文件副本涉及網絡驅動器,則可能有不同的算法。但是,除非你的估計在一段時間內相當一致,等於30秒或者估計時間的10%,那麼顯示「哦,親愛的,當它大幅放慢時,似乎有某種滯留」,或者忽略如果它大幅度加速的話。
例如,在1秒間隔拍攝對話框中的消息時,連接簡單檔:
remaining: 60 seconds // estimate is 60 seconds
remaining: 59 seconds // estimate is 59 seconds
remaining: delayed [was 59 seconds] // estimate is 12 hours
remaining: delayed [was 59 seconds] // estimate is infinity
remaining: delayed [was 59 seconds] // got data: estimate is 59 seconds
// six seconds later
remaining: 53 seconds // estimate is 53 seconds
我一直在琢磨這一個自己。我有一個複製例程 - 通過Windows資源管理器風格的界面 - 它允許從Android設備傳輸選定的文件到PC。
在開始時,我知道要複製的文件的總大小,並且在使用C#.NET時,我使用秒錶來獲取已用時間,並且在複製正在進行中,我以字節爲單位保留了迄今爲止複製的內容。
我沒有實際測試過,但最好的辦法似乎是這樣的 -
經過估算= *((總計TOTALSIZE - copiedSoFar)/ copiedSoFar)
工作了它是如何在Windows上進行,那麼做相反的事情將是一個很好的起點。 8-) – RichieHindle 2009-07-20 07:59:26
好漫畫。我沒看過這個。 – 2009-07-20 08:25:12