2009-07-20 123 views
6

They could say "the connection is probably lost," but it's more fun to do naive time-averaging to give you hope that if you wait around for 1,163 hours, it will finally finish.計算文件副本/移動的估計時間?

xckd cartoon我不知道什麼是提供一個估計將文件複製/移動的用戶的最佳機制的啓發?

上XKCD的ALT標籤內容如下:

他們可能會說「的連接可能丟失,」但它更有趣的事情天真的時間平均給你希望,如果你在附近等1,163小時,它會最終完成。

忽略這個有趣的事實,它是如何在Windows中完成的?其他操作系統如何?有沒有更好的辦法?

+0

工作了它是如何在Windows上進行,那麼做相反的事情將是一個很好的起點。 8-) – RichieHindle 2009-07-20 07:59:26

+1

好漫畫。我沒看過這個。 – 2009-07-20 08:25:12

回答

3

看看my answer to a similar question(以及那裏的其他答案),瞭解如何在Windows資源管理器中估計剩餘時間。

在我看來,只有得到良好的估算方法之一:

  • 計算開始在複製過程之前要複製的字節的確切數字
  • 重新計算您定期估計(每1, 5或10秒,YMMV)基於當前傳輸速度
  • 當您在網絡上進行復制時,當前傳輸速度可能會大幅波動,因此請使用平均值,例如根據自上次估計以來傳輸的字節數。

請注意,如果您要複製許多文件,第一點可能需要很多工作。這可能就是爲什麼來自微軟的人決定放棄它的原因。您需要確定自己是否值得爲用戶提供更好的估算,從而計算出的額外開銷。

0

最重要的是我永遠不會顯示秒(只有幾小時和幾分鐘)。我認爲當你坐在那裏等待一分鐘,而計時器跳過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分鐘工作一次(取決於應用程序)。

+0

如果您要複製,說100GB的視頻會發生什麼?它不會發生太多的事情,但它*會發生...... – RCIX 2009-07-20 08:28:06

0

談到網絡文件副本,最好的辦法是計算要傳輸文件的大小,網絡響應等,我曾經曾經是一個辦法:

連接速度=中國平安和計算往返時間與15千字節的包。

讓我的文件大小,看看,theorically,如果我會用我的連接速度打破它在 15 kb的包需要多少時間服用。

轉移開始後重新計算我的連接速度,並調整將要耗費的時間。

2

我已經做了一些類似的估計,當一個隊列將是空的時候,考慮到這些項目的入隊速度比入隊更快。我使用最近的N次讀數(時間,隊列大小)進行線性迴歸。

這給了更好的結果不是一個天真的

(bytes_copied_so_far/elapsed_time) * bytes_left_to_copy 
1
  • 啓動一個全球性的計時器,大火說,每1000毫秒和更新總elpased時間計數器。我們稱這個變量爲「elapsedTime
  • 在複製文件時,用已經複製的數量更新某個局部變量。我們稱這個變量爲「totalCopied
  • 在定期發生的定時器事件中,將totalCopied除以totalElapsed以給出每個定時器間隔(本例中爲1000ms)複製的字節數。我們稱這個變量爲「bytesPerSec
  • 將總文件大小除以bytesPerSec並獲得理論上覆制此文件所需的秒數。我們稱這個變量爲remainingTime
  • remainingTime減去elapsedTime並且您對文件複製時間有些準確的計算。
1

我認爲對話應該承認它們的侷限性。這並不煩人,因爲它沒有給出有用的時間估計,這是令人討厭的,因爲它權威地提供了一個明顯無稽之談的估計。

因此,根據目前的利率或平均利率來估算你喜歡的,滾動平均數,丟棄異常值等。取決於將其延遲的事件的操作和典型持續時間,因此,如果知道文件副本涉及網絡驅動器,則可能有不同的算法。但是,除非你的估計在一段時間內相當一致,等於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 
0

我一直在琢磨這一個自己。我有一個複製例程 - 通過Windows資源管理器風格的界面 - 它允許從Android設備傳輸選定的文件到PC。

在開始時,我知道要複製的文件的總大小,並且在使用C#.NET時,我使用秒錶來獲取已用時間,並且在複製正在進行中,我以字節爲單位保留了迄今爲止複製的內容。

我沒有實際測試過,但最好的辦法似乎是這樣的 -

經過估算= *((總計TOTALSIZE - copiedSoFar)/ copiedSoFar)