Wiem, że okno dialogowe kopiowania systemu Windows (w systemie Windows XP) najpierw przechowuje kopię w pamięci i nadal kopiuje się po zamknięciu okna dialogowego, więc czas jest wyłączony, ale dlaczego szacuje się, ile czasu zajmie wykonanie kopii tak niedokładne, nawet jeśli kopiowanie pamięci zostało wyłączone (w Vista i Windows 7)? To wydaje się takie arbitralne! Jak działa cała procedura kopiowania i dlaczego system Windows nie może jej poprawnie oszacować?
windows
file-transfer
Maksym Zasławski
źródło
źródło
Odpowiedzi:
W skrócie: słabe algorytmy i błędne oszacowanie są w rzeczywistości słabością implementacyjną.
Inne narzędzia, takie jak TeraCopy, wykonują lepszą pracę. Myślę, że nie warto wyjaśniać, dlaczego ich wdrożenie nie jest dobre. Zauważą to i poprawią się.
Co jest trudne:
W tym przypadku ważną rolę odgrywa nie tylko liczba bajtów, ale także liczba tworzonych plików. Jeśli masz milion plików 1KB lub tysiąc plików 1 MB, sytuacja będzie zupełnie inna, ponieważ na pierwszym z nich powstaje wiele plików. W zależności od używanego systemu plików może to zająć więcej czasu niż faktyczne przesłanie danych.
To okno doprowadziło mnie również do szału kilka razy:
Współczesne kopiowanie systemu Windows nie jest dużo lepsze:
źródło
Raymond Chen napisał kiedyś bardzo fajny artykuł na ten temat. Zasadniczo okno dialogowe zgaduje :).
http://blogs.msdn.com/b/oldnewthing/archive/2004/01/06/47937.aspx
źródło
Będę liczyć do dziesięciu,
1....2....3....4
ile kropek zajmie dotarcie do 10?5.6.7
Co teraz? Czy bierzesz pod uwagę wszystkie poprzednie kropki między liczbami i średnią, czy bierzesz tylko ostatnie 4 przedziały i używasz tej średniej, czy patrzysz tylko na ostatni przedział?Masz ten sam problem z przesyłaniem plików. Szybkość przesyłania plików nie jest stała, przyspiesza i zwalnia na podstawie wielu czynników. Powodem, dla którego liczba przeskakuje tak bardzo, jest fakt, że Microsoft pochylił się w stronę widma „licz tylko ostatni przedział”.
Po tej stronie widma nie ma nic złego, daje dokładniejsze „sekundy na sekundę” (jedna sekunda w czasie rzeczywistym powoduje, że licznik zmniejsza się o jedną sekundę), ale powoduje to, że całkowita ETA licznika czasu przeskakuje dużo .
Dobrym przykładem przeciwnej strony jest 7-Zip podczas kompresji. Jeśli szybkość kompresji spadnie podczas przetwarzania, można zauważyć, że ETA nie skacze gwałtownie jak ETA przesyłania plików, ale może minąć od 2 do 3 rzeczywistych sekund, zanim licznik czasu skróci się o jedną sekundę (lub nawet może zacząć się odliczać ), aż ustabilizuje się przy nowej prędkości.
źródło
W rzeczywistości jest prawie kanoniczna odpowiedź Raymonda Chena na ten temat z WAAAAAY, a układanka zawiera kilka elementów.
Po pierwsze, Windows zgaduje. Wie, ile plików i jak duże są, ale szybkość transferu na plik jest bardzo zmienna. W niektórych przypadkach zależy to od wielkości, a nawet lokalizacji na dysku. Z biegiem czasu dostosowuje zgadywanie na podstawie bieżących i przeszłych warunków, a zatem masz niedokładne szacunkowe prędkości transferu w rzeczywistych warunkach.
źródło
Oto wyjaśnienie przez Raymond Chen , główny Software Design Engineer w firmie Microsoft:
Blogu cytowany powyżej ma długą dyskusję na temat tego problemu, z ciekawych komentarzy.
Raymond Chen to legendarna osoba, „Chuck Norrisa Microsoftu”, nie sądzę, że dostaniesz bardziej wiarygodną odpowiedź. Jestem pewien, że przynajmniej widział ten kod.
źródło
Oczywistym powodem jest to, że prędkość transferu zmienia się w czasie, podobnie jak średnia, podobnie jak prognozy. Aby wyjaśnić to przyjacielowi, który nie jest technologiem, wykorzystałem analogię do podróży samolotem. Lecisz nad Atlantykiem. Po przylocie taksówki na lotnisko odlotu, ETA wynosi około dwóch miesięcy. Kiedy wysiadasz na lotnisku docelowym, w oparciu o dotychczasową średnią prędkość, dotrzesz do domu przyjaciela w 5 sekund.
Musisz jednak docenić, jak bardzo prędkość może się różnić, nawet w przypadku scenariusza, który wydaje się przewidywalny, np. Kopiowanie plików na tym samym dysku lub między dwoma dyskami lokalnymi. Jedną z nowych funkcji, które lubię w systemie Windows 8, jest możliwość wykresu prędkości w czasie, jeśli klikniesz „więcej szczegółów”. Jeśli nie masz dostępu do komputera z systemem Windows 8, wyszukaj obrazy w oknie dialogowym kopiowania systemu Windows 8, aby znaleźć wiele przykładów. Wiele z nich jest dość płaskich, ale wiele z nich jest również niepokojąco wyboistych, do tego stopnia, że zastanawiasz się, czy dysk twardy jest naprawdę zdrowy, kiedy spada do zera.
Niektóre z tych nierówności są prawdopodobnie spowodowane różnicami w rozmiarze pliku - mniejsze pola dają większy dostęp, co spowalnia działanie, szczególnie na mechanicznym dysku twardym, który musi szukać przesuwając głowicę odczytu - ale niektóre mogą być po prostu tanim dyskiem, który zatrzymuje się przy najmniejszym dotyku, aby zapobiec uszkodzeniu talerzy.
Istnieją lepsze i gorsze algorytmy przewidywania ETA, ale aby uzyskać dokładne przewidywanie, komputer musiałby być wszechwiedzący. Ryzyko próby uczynienia algorytmu „inteligentnym” polega na tym, że może stworzyć nowe, nieprzewidziane przypadki, w których będzie jeszcze zabawniej niepoprawnie.
źródło
Jedynym sposobem, aby wiedzieć, ile czasu zajmie skompresowanie zestawu plików, jest ich skompresowanie. Czasami najlepsze przypuszczenia systemu Windows są bliskie, a czasem bardzo błędne. To samo dotyczy kopiowania dużej liczby plików, na pewno zauważyłeś.
To nie tyle błąd, co bezużyteczne wyświetlanie rzadko trafnych informacji. Najlepszym sposobem, aby to naprawić, jest zamknięcie oczu. Zignoruj to. ;-)
Być może istnieje program, który może kopiować / kompresować pliki i emitować dźwięk alarmu po zakończeniu. To byłoby naprawdę przydatne. Moglibyśmy się trochę zdrzemnąć, czekając, aż Windows zakończy sprzątanie domu.
źródło
Myślę, że powód został dobrze wyjaśniony w jednym z komentarzy do postu na blogu połączonym odpowiedzią Roalda:
Powodem, dla którego podaje tak okropne szacunki, jest to, że nie jest to dobrze zrobione. Oczywiście nigdy nie może być w 100% precyzyjny, ale może być znacznie, znacznie lepiej.
źródło
Aby przyspieszyć proces kopiowania (nie spędzać zbyt dużo czasu na obliczaniu szacunkowych czasów zamiast wykonywania operacji związanych z kopiowaniem), narzędzie do kopiowania systemu Windows wbudowane w Eksploratora przechowuje ograniczoną ilość informacji o tym, jak szybko zakończono poprzednie operacje zapisu. Za każdym razem, gdy musi obliczyć pozostały czas, po prostu oblicza średni czas wykonywania operacji zapisu, a następnie mnoży przez liczbę pozostałych operacji zapisu.
Problem polega na tym, że czas potrzebny na wykonanie operacji zapisu nie jest stały - w rzeczywistości może się znacznie różnić. To z kolei powoduje znaczące zmiany w oszacowaniu czasu.
źródło
A
] i liczby punktów danych użytych do uzyskania tej średniej [n
]. Następnie, aby go zaktualizować, to tylko przypadek(A*n + [New value])/[n+1]
. Ponadto, ponieważ operacje kopiowania są prawie zawsze związane z operacjami we / wy, a nie z procesorem, proste obliczenia takie co kilka sekund są niczym. Z drugiej strony, utrzymywanie średniej z ostatnichn
zapisów wymaga tablicy / kolejki / stosun
elementów - więc wiesz, która wartość ma zostać eksmitowana.Należy wziąć pod uwagę 3 czynniki:
Liczby 1 i 3 wydają się mieć najbardziej oczywisty wpływ na obliczanie czasu transferu, ale bardzo wiele osób nie bierze pod uwagę liczby 2. Może to mieć ogromny wpływ na czas transferu i jest trudne do oszacowania.
Zasadniczo za każdym razem, gdy plik jest zapisywany, system plików musi zapisać trochę metadanych dotyczących pliku, np. własność, uprawnienia, czasy tworzenia / modyfikacji / dostępu itp. W zależności od konkretnego systemu plików, informacje te mogą zostać zapisane na części dysku bardzo „daleko” od miejsca, w którym zapisywany jest plik. Ten narzut systemu plików może sprawić, że pozornie prosty transfer zajmie dużo czasu i / lub sprawi, że oszacowanie czasu gwałtownie się zmieni.
np .: Przesyłając jeden duży plik, zauważysz, że oszacowanie jest stabilne i dość dokładne, ale przesyłanie setek plików o różnych rozmiarach, ale o tym samym rozmiarze całkowitym, może potrwać dłużej i spowodować, że oszacowanie czasu dopasuje się.
źródło
Istnieją trzy braki w obecnych algorytmach szacowania.
Wbrew powszechnemu przekonaniu, nie są one wystarczająco trudne, aby podnieść nasze ręce.
Powód, dla którego większość osób piszących blogi i ludzie tutaj nie zdają sobie sprawy z tej możliwości, jest najlepszy, co mogę powiedzieć, ze względu na dziedzinę nauki i szerokość szkoły. Skromne, ale jednocześnie bardzo wygodne lekarstwo powinno być możliwe dla [absolwenta z nowszym szkoleniem niż autorzy blogów] [firmy wartej wiele miliardów dolarów] Microsoft.
Spróbuję z grubsza wyjaśnić, dlaczego.
Punkty awarii są następujące. Jądro:
1. nie może wiarygodnie przewidzieć przyszłego obciążenia We / Wy ze względu na okoliczności poza zakresem jądra
2. nie śledzi heurystyki IO w żadnym użytecznym poziomie szczegółowości. Wykorzystanie jest znacznie szerszą koncepcją niż prędkość odczytu / zapisu na dysku / sieci .
bardzo niewiele trzeba z tym zrobić, niewiele więcej niż śledzenie najbardziej podstawowych informacji o wykorzystaniu IO
3. gdyby były śledzone , nie miałyby zastosowania do heurystyki
Chodzi o to, że nasz model ma tylko 2a = kompleks F * (bxc) + d
Gdzie a, b i c mają 3 stany: menedżer plików zerknie na pliki (lub tylko metadane) przed kopiowaniem, a F * (bxc) + d nie jest drogim obliczeniem; jeśli chcesz czegoś dokładniejszego, skorzystaj z tabeli odnośników zawierającej więcej stanów - prawie żadnych obliczeń.
Uwaga: wymiary tutaj są dla talerza, byłyby inne z dyskiem SSD - początek / środek / koniec nie miałyby znaczenia
Kluczową różnicą między tym, co opisałem, a poprzednimi implementacjami, które do tej pory widzieliśmy, byłoby, w skrócie, obserwowanie rozmiaru pliku i rozproszenia / entropii pliku na dysku oraz wykorzystanie go [bardziej] do dokładniejszego uwzględnienia elementu czasowego użycia dysku.
(patent pozostawiono czytelnikowi jako ćwiczenie ...)
źródło
Istnieje wiele „nieznanych” zmiennych, gdy próbujesz przewidzieć, ile czasu zajmie coś. Na przykład, chociaż program wie, że istnieje 3500 plików i że pliki mają pojemność 3,5 GB (3500 MB), czy to oznacza, że każdy plik ma 1 MB? Niekoniecznie. Może być wiele plików o rozmiarze 4 KB i wiele plików o rozmiarze 100 MB, a niektóre inne pomiędzy nimi. Ponadto należy wziąć pod uwagę, skąd pochodzą pliki i dokąd idą (np. Media). Jakie jest największe wąskie gardło? W jaki sposób konto próbuje skopiować pliki z dysku twardego przez tunel VPN ? Podajesz najlepszy scenariusz, a następnie dostosowujesz liczniki w czasie rzeczywistym. Właśnie dlatego te wskaźniki postępu zmieniają się w locie.
źródło
Matematycznie poprawny model polega na naiwnym uśrednianiu i ekstrapolacji:
Powodem jest to, że zgodnie z prawem dużych liczb lokalne fluktuacje zlikwidują uśrednioną prędkość transferu , a to da ci najbardziej stabilny wynik.
Wydaje się, że Microsoft robi obliczenia prędkości przesyłania w najnowszym przedziale czasowym. Oznacza to, że każda lokalna fluktuacja znacząco zmienia wynik.
źródło
Jak powiedział Roald van Doorn, to po prostu zgadywanie. Oczywiście nie oznacza to, że nie może być lepszym zgadywaczem. Istnieje wiele heurystyk, które można by wykorzystać do obliczenia tego.
Oczywiście nic z tego nie jest łatwe do zaimplementowania .. i wspomniałem tylko o kopiach plików. Podobna praca musiałaby zostać wykonana dla wszystkich rodzajów transferów.
Pytanie, które musisz sobie zadać - czy wolisz spędzić czas na Microsoft, aby lepiej oszacować, czy raczej przyspieszyć przesyłanie plików.
Jeśli jednak skompresujesz coś za pomocą 7-zip, zauważysz, że jest to znacznie lepsze niż zgadywanie niż Windows. Wątpię, żeby robiło to coś skomplikowanego, tylko trochę lepsze zgadywanie.
źródło
Krótko mówiąc, obliczenia oparte są na bieżącej prędkości transferu .
Na przykład: jeśli szybkość transferu spada, ponieważ system Windows musi skopiować ogromną liczbę małych plików, oczekiwany czas rośnie liniowo i odwrotnie w przypadku dużych plików.
Jest prawie niemożliwe do przewidzenia, jaka będzie prędkość przesyłania w całym procesie przesyłania, ponieważ zależy to od wielu czynników, takich jak rozmiar pliku, użycie procesora, błędy transmisji itp.
źródło
Istnieje kilka interesujących odpowiedzi w poście na blogu MSDN Ulepszenie naszych podstawowych zasad zarządzania plikami: kopiuj, przenieś, zmień nazwę i usuń . Dlaczego jest to trudne:
I jak się poprawiają,
To powiedziawszy, jeśli naprawdę chcesz poprawić tylko podane oszacowanie i zachować pasek postępu w obecnej postaci, możesz zrobić coś sugerowanego w komentarzu Slashdot :
źródło
Chciałem tylko dodać, że całkowita liczba plików jest z pewnością najbardziej czasochłonnym czynnikiem operacji kopiowania plików na komputerze. Zawsze pamiętam, jako młody uczeń, celowo powodując awarię komputerów w mojej klasie komputerowej, zaczynając od 1 pliku bez zawartości i kopiując go, a następnie wybierając 2 pliki i kopiując ponownie i tak dalej. Gdy minęło około 1024 plików, zajęło to dużo czasu, aby cokolwiek zrobić, nawet gdy kopiowano bez zapisywania informacji dla nagłówka pliku. Wypróbuj go nawet na nowym systemie operacyjnym, wykładniczej kopii pliku, a zobaczysz, co się stanie. Jedzenie do namysłu.
źródło
Właśnie skopiowałem 200 GB z dysku twardego USB na główny dysk. Było około 130000 plików
Po pierwszych 4-5 minutach zauważyłem, że:
Na początku okna zmieniły oszacowanie z około 1 godziny na ponad 5 godzin, a następnie z powrotem na 1 godzinę i tak dalej. Na koniec, podobnie jak w 95%, wciąż zmieniała szacunki z 10 minut na ponad 10 godzin. Więc zamiast stawać się coraz dokładniejszym, stawało się coraz mniej precyzyjne.
Prosta matematyka pokazuje:
130 000 plików przy 100 plikach na sekundę = 22 minuty
200 000 MB przy 70 MB na sekundę = 47 minut
22 minuty - czas oczekiwania na kopiowanie plików o wielkości kilku kilobajtów. 47 minut - czas potrzebny na przesłanie rzeczywistych danych, jeśli nie ma czasu wyszukiwania.
Suma 22 minut + 47 minut to absolutny maksymalny czas, jaki może to zająć.
Więc oczywiście szacunek powinien wynosić od 47 do 69 minut.
Co pokazuje okno dialogowe w około 90%: „Kopiuję niektóre małe pliki z prędkością 1 MB / s, danych jest o 20 GB więcej, ukończenie zajmie 5:30 godzin.
Kilka sekund później: „Kopiuję tutaj duży plik, przy prędkości 70 Mb / s ukończenie zajmie 4 minuty.
To, co faktycznie widzi człowiek w tym samym oknie dialogowym: 120 000 plików i 180 GB jest już kopiowanych przez 40 minut. Pozostałe 10000 plików i 20 GB powinno zająć około 5 minut
Okno dialogowe zawiera wystarczającą ilość informacji, aby obliczenia były coraz bardziej dokładne z każdą sekundą. Zna szybkość kopiowania małych plików. Wie, z jaką prędkością kopiowane są duże pliki. Wie również, ile plików i ile bajtów zostało.
Tak dokładne założenie jest tak proste, jedynie poprzez ustawienie górnej i dolnej granicy.
Okno dialogowe pokazuje nieco więcej poprawnych danych tylko w przypadku, gdy duże pliki znajdują się przed małymi plikami. W takim przypadku zaczyna się po 40 minutach, a po 30 minutach zaczyna kopiować małe pliki i mówi „no cóż, potrzebuję jeszcze 20 minut”.
Ale kiedy małe pliki na początku i duże pliki są na końcu. Okno dialogowe tak naprawdę nie dba o to, jakie „pliki na sekundę” przenosi małe pliki. Oblicza się tak, jakby liczba małych plików była nieskończonością, i tak, jakby na zawsze były małe.
źródło