2009-07-20 33 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.Tính toán thời gian ước tính của các bản sao/chuyển động của tệp?

Lấy cảm hứng từ điều này xckd cartoon Tôi tự hỏi chính xác cơ chế tốt nhất để cung cấp ước tính cho người dùng sao chép/di chuyển tệp là gì?

Các alt thẻ trên xkcd đọc như sau:

Họ có thể nói "kết nối được có thể bị mất", nhưng nó là thú vị hơn để làm ngây thơ thời gian trung bình để cung cấp cho bạn hy vọng rằng nếu bạn chờ đợi xung quanh cho 1,163 giờ, cuối cùng nó sẽ kết thúc.

Bỏ qua điều thú vị, đó thực sự là cách thực hiện trong Windows? Làm thế nào về hệ điều hành khác? Có cách nào tốt hơn?

+0

làm việc ra làm thế nào nó được thực hiện trên Windows và sau đó làm ngược lại chính xác sẽ là một điểm khởi đầu tốt. 8-) – RichieHindle

+1

Đẹp truyện tranh. Tôi đã không thấy cái này. –

Trả lời

3

Hãy xem my answer to a similar question (và các câu trả lời khác ở đó) về cách ước tính thời gian còn lại trong Windows Explorer.

Theo tôi, chỉ có một cách để có được ước tính tốt:

  • Tính chính xác số lượng byte được sao chép trước khi bạn bắt đầu quá trình sao chép
  • Tính toán lại bạn ước tính thường xuyên (mỗi 1, 5 hoặc 10 giây, YMMV) dựa trên tốc độ truyền hiện tại
  • Tốc độ truyền hiện tại có thể dao động mạnh khi bạn sao chép trên mạng, vì vậy hãy sử dụng trung bình, ví dụ dựa trên số byte được chuyển kể từ lần ước tính cuối cùng của bạn.

Lưu ý rằng điểm đầu tiên có thể yêu cầu khá nhiều công việc, nếu bạn đang sao chép nhiều tệp. Đó có lẽ là lý do tại sao những kẻ từ Microsoft quyết định đi mà không có nó. Bạn cần tự quyết định xem chi phí bổ sung được tạo bởi phép tính đó có đáng để mang lại cho người dùng của bạn ước tính tốt hơn không.

+0

+1 để sử dụng cửa sổ trượt. – RichieHindle

0

Hầu hết tất cả tôi sẽ không bao giờ hiển thị giây (chỉ có giờ và phút). Tôi nghĩ rằng nó thực sự bực bội khi bạn ngồi đó và chờ một phút trong khi bộ đếm thời gian nhảy từ 10 đến 20 giây. Và luôn hiển thị thông tin thực như: xxx/yyyy MB đã sao chép.

Tôi cũng sẽ bao gồm một cái gì đó như thế này:

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 

Tôi cũng xin thông báo cho người dùng nếu thời gian dự kiến ​​thay đổi quá nhiều

Và nếu nó không quá phức tạp, cần có một chức năng kiểm tra tự động kiểm tra xem quá trình này vẫn còn hoạt động và hoạt động bình thường sau mỗi 1-10 phút (tùy thuộc vào ứng dụng).

+0

Điều gì xảy ra sau đó nếu bạn đang sao chép, 100GB video?nó không xảy ra nhiều nhưng nó * có thể * xảy ra ... – RCIX

0

nói về sao chép tập tin mạng, điều tốt nhất là để tính toán kích thước tập tin được chuyển giao, đáp ứng mạng và vv Một cách tiếp cận mà tôi sử dụng một lần là:

Tốc độ kết nối = Ping và tính toán thời gian khứ hồi cho gói với 15 Kbytes.

Nhận kích thước tệp của tôi và xem, về mặt lý thuyết, sẽ mất bao nhiêu thời gian nếu tôi chia nhỏ nó trong gói 15 kb sử dụng tốc độ kết nối của tôi.

Tính toán lại tốc độ kết nối của tôi sau khi quá trình truyền được bắt đầu và điều chỉnh thời gian sẽ được sử dụng.

2

Tôi đã thực hiện một cái gì đó tương tự để ước tính khi hàng đợi sẽ trống, cho rằng các mặt hàng đang được khử nước nhanh hơn so với khi chúng được xếp hàng. Tôi đã sử dụng hồi quy tuyến tính trong các lần đọc gần đây nhất của N (thời gian, kích thước hàng đợi).

này cho kết quả tốt hơn so với một ngây thơ

(bytes_copied_so_far/elapsed_time) * bytes_left_to_copy 
1
  • Bắt đầu một timer toàn cầu lửa nói, mỗi 1000 mili giây và cập nhật tổng elpased bộ đếm thời gian. Hãy gọi biến này là "elapsedTime"
  • Trong khi tệp đang được sao chép, hãy cập nhật một số biến cục bộ với số tiền đã được sao chép. Hãy gọi biến này là "totalCopied"
  • Trong sự kiện hẹn giờ được định kỳ nâng lên, chia totalCopied cho totalElapsed để cung cấp số byte được sao chép cho mỗi khoảng thời gian (trong trường hợp này là 1000ms).Hãy gọi biến này là "bytesPerSec"
  • Chia tổng kích thước tệp theo bytesPerSec và nhận tổng số giây theo lý thuyết cần thiết để sao chép tệp này. Hãy gọi biến này remainingTime
  • Trừ trừ elapsedTime từ remainingTime và bạn tính toán phần nào chính xác cho thời gian sao chép tệp.
1

Tôi nghĩ rằng các hộp thoại chỉ nên thừa nhận giới hạn của chúng. Nó không gây phiền nhiễu bởi vì nó không đưa ra một ước tính thời gian hữu ích, nó gây phiền nhiễu bởi vì nó tạo ra một ước tính rõ ràng là vô nghĩa.

Vì vậy, ước tính bạn muốn, dựa trên tỷ lệ hiện tại hoặc tỷ lệ trung bình cho đến thời điểm này, trung bình lăn loại bỏ các ngoại lệ hoặc bất kỳ điều gì. Phụ thuộc vào hoạt động và thời lượng điển hình của sự kiện trì hoãn nó, vì vậy bạn có thể có các thuật toán khác nhau khi bạn biết bản sao tệp liên quan đến ổ đĩa mạng. Nhưng cho đến khi ước tính của bạn tương đối ổn định trong một khoảng thời gian bằng 30 giây hoặc 10% thời gian ước tính, hiển thị "ồ, có vẻ như có một số kiểu bị giữ" khi nó bị chậm lại hoặc chỉ bỏ qua nếu nó tăng nhanh.

Ví dụ, các thông điệp thoại chụp trong khoảng thời gian 1 giây khi một kết nối quầy hàng ngắn gọn:

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

Tôi đã nghĩ đến điều này một mình. Tôi có thói quen sao chép - thông qua giao diện kiểu Windows Explorer - cho phép chuyển các tệp đã chọn từ Thiết bị Android sang PC.

Khi bắt đầu, tôi biết tổng kích thước của tệp sẽ được sao chép và khi tôi đang sử dụng C# .NET, tôi đang sử dụng Đồng hồ bấm giờ để có thời gian trôi qua và trong khi sao chép đang được tiến hành, tôi đang giữ tổng số những gì được sao chép cho đến nay, về mặt byte.

tôi đã không thực sự thử nghiệm nó, nhưng cách tốt nhất có vẻ là này -

ước tính = trôi qua * ((totalSize - copiedSoFar)/copiedSoFar)

Các vấn đề liên quan