Oczywiście można podzielić pozostały rozmiar pliku przez bieżącą prędkość pobierania, ale jeśli prędkość pobierania będzie zmieniać się (i będzie), nie da to bardzo dobrego wyniku. Jaki jest lepszy algorytm do tworzenia płynniejszych odliczeń?Jak oszacować czas pozostały do końca (dokładnie)?
Odpowiedz
An exponential moving average jest świetny do tego. Zapewnia to sposób na wygładzenie średniej, dzięki czemu za każdym razem, gdy dodajesz nową próbkę, starsze próbki stają się coraz ważniejsze od ogólnej średniej. Nadal są brane pod uwagę, ale ich znaczenie spada wykładniczo - stąd nazwa. A ponieważ jest to "wzruszająca" średnia, wystarczy zachować tylko jeden numer.
W kontekście pomiaru prędkości pobierania formuła będzie wyglądać następująco:
averageSpeed = SMOOTHING_FACTOR * lastSpeed + (1-SMOOTHING_FACTOR) * averageSpeed;
SMOOTHING_FACTOR
jest liczbą z przedziału od 0 do 1. Im wyższa jest ta wartość, tym szybciej starsze próbki są odrzucane. Jak widać w formule, gdy SMOOTHING_FACTOR
jest 1, po prostu używasz wartości swojej ostatniej obserwacji. Gdy SMOOTHING_FACTOR
jest 0 averageSpeed
nigdy się nie zmienia. Więc chcesz czegoś pomiędzy, a zazwyczaj niskiej wartości, aby uzyskać przyzwoite wygładzenie. Zauważyłem, że 0,005 zapewnia całkiem dobrą wartość wygładzania dla średniej prędkości pobierania.
lastSpeed
to ostatnio zmierzona prędkość pobierania. Możesz uzyskać tę wartość, uruchamiając co sekundę timer, aby obliczyć liczbę pobranych bajtów od czasu ostatniego uruchomienia.
averageSpeed
to oczywiście numer, którego chcesz użyć do obliczenia szacowanego pozostałego czasu. Zainicjuj go na pierwszy uzyskany pomiar lastSpeed
.
Myślę, że najlepiej jest podzielić pozostały rozmiar pliku przez średnią prędkość pobierania (pobraną do tej pory podzieloną przez okres pobierania). To będzie się wahać trochę, aby rozpocząć, ale będzie bardziej stabilne, gdy będziesz pobierać.
, ale należy wziąć pod uwagę przypadek, w którym użytkownik pobierał dane przez ostatnie 24 godziny, a minuty temu połączenie internetowe zostało po prostu uszkodzone, a użytkownik nie ma nieskończonego czasu pobierania. Czy to błąd lub funkcja? – TiansHUo
Czas pobierania będzie miał tendencję do nieskończoności, jeśli połączenie pozostanie zerwane. –
Taa ... Nie sądzę, że podoba mi się to rozwiązanie. Zbyt wiele czasu temu przywiązuje się do prędkości pobierania. Szczególnie przeszkadza mi to, że pierwsze kilka sekund pobierania jest zwykle dość niestabilne, ponieważ przyspiesza (torrenty łączące się z większymi ziarnami) lub zwalnia (moc Shaw'a słabnie), a więc myślę, że powinienem zostać całkowicie zdyskontowany. – mpen
W odpowiedzi na odpowiedź Bena Dolmana można również obliczyć wahania w ramach algorytmu. Będzie bardziej gładki, ale pozwoli przewidzieć średnią prędkość.
coś takiego:
prediction = 50;
depencySpeed = 200;
stableFactor = .5;
smoothFactor = median(0, abs(lastSpeed - averageSpeed), depencySpeed);
smoothFactor /= (depencySpeed - prediction * (smoothFactor/depencySpeed));
smoothFactor = smoothFactor * (1 - stableFactor) + stableFactor;
averageSpeed = smoothFactor * lastSpeed + (1 - smoothFactor) * averageSpeed;
Wahania, czy nie, to będzie zarówno stabilny jak inne, z odpowiednimi wartościami dla przewidywania i depencySpeed; musisz grać z nią trochę w zależności od szybkości Internetu. Ustawienia te są idealne dla przeciętnej prędkości 600 kB/s przy wahaniach od 0 do 1 MB.
Być może wtedy możesz oprzeć swoją prognozę na poprzednich pobraniach? Nadgodziny będą bardziej dokładne. – mpen
Napisałem algorytm lat temu, aby przewidzieć czas pozostały w programie do przetwarzania obrazu i multiemisji dysków, który używał średniej ruchomej z resetem, gdy bieżąca przepustowość wykroczyła poza wcześniej zdefiniowany zakres. Zachowałoby to płynność, gdyby nie wydarzyło się coś drastycznego, a następnie szybko się dostosowuje, a następnie znów powraca do średniej ruchomej. Zobacz przykładowy wykres tutaj:
Gruba linia niebieska w tym przykładzie wykresu jest rzeczywista przepustowość w czasie. Zauważ niską przepustowość podczas pierwszej połowy transferu, a następnie dramatycznie skacze w drugiej połowie. Pomarańczowa linia jest ogólną średnią. Zauważ, że nigdy nie dostosowuje się wystarczająco daleko, aby kiedykolwiek dokładnie przewidzieć, jak długo potrwa. Szara linia jest średnią ruchomą (tj.średnia z ostatnich N punktów danych - na tym wykresie N wynosi 5, ale w rzeczywistości N może wymagać większego dostatecznie gładkiego). Odzyskuje się szybciej, ale wciąż wymaga trochę czasu, aby dostosować. To zajmie więcej czasu, im większe N. Więc jeśli twoje dane są dość głośne, wtedy N będzie musiało być większe, a czas przywracania będzie dłuższy.
Zielona linia to algorytm, którego użyłem. Działa podobnie jak średnia ruchoma, ale gdy dane poruszają się poza wcześniej zdefiniowanym zakresem (wyznaczonym jasnymi cienkimi niebieskimi i żółtymi liniami), resetuje średnią ruchomą i natychmiast podskakuje. Predefiniowany zakres może również opierać się na odchyleniu standardowym, dzięki czemu może dostosować się do tego, jak hałaśliwe są dane automatycznie. Właśnie rzuciłem te wartości do Excela, aby je wyrysować dla tej odpowiedzi, więc nie jest idealnie, ale masz pomysł.
Dane mogą być wymyślone, aby ten algorytm nie był dobrym predyktorem pozostałego czasu. Najważniejsze jest to, że musisz mieć ogólne pojęcie o tym, jak możesz oczekiwać danych i odpowiednio wybrać algorytm. Mój algorytm działał dobrze dla zestawów danych, które widziałem, więc ciągle go używaliśmy.
Inną ważną wskazówką jest to, że zwykle programiści ignorują czasy konfiguracji i rozbierania w swoich paskach postępu i obliczeniach czasu. Powoduje to odwieczny 99% lub 100% pasek postępu, który po prostu siedzi tam przez długi czas (podczas buforowania są przepłukiwane lub inne prace czyszczące się dzieje) lub dzikie wczesne prognozy, gdy skanowanie katalogów lub inne prace konfiguracyjne się zdarzają, gromadzenie czasu ale nie osiąga żadnego postępu procentowego, który wszystko wyrzuca. Możesz uruchomić kilka testów, które obejmują czas instalacji i rozładowania, a także oszacować, jak długo te czasy są przeciętne lub na podstawie wielkości pracy i dodać ten czas do paska postępu. Na przykład pierwsze 5% pracy to praca konfiguracyjna, a ostatnie 10% to praca związana z odkładaniem, a 85% w środku to pobieranie lub jakikolwiek powtarzający się proces śledzenia. To też może bardzo pomóc.
Dobre rady! Dziękuję za podzielenie się. – mpen
- 1. czas pozostały do opłat jest kompletna, iOS
- 2. Pozostały czas do zawieszenia systemu Windows
- 3. Szacowany pozostały czas, czego brakuje?
- 4. Najkrótszy pozostały czas Najpierw: Wielowątkowość Java
- 5. Uzyskaj pozostały czas pracy na baterii z telefonu z Androidem
- 6. Jak dokładnie uzyskać aktualny czas UTC przez strtotime?
- 7. Jak przewinąć do końca System.Windows.Forms.WebBrowser?
- 8. Jak dodać do końca listy w prologu
- 9. Jak mogę oszacować ściśliwość pliku bez kompresji?
- 10. Jak oszacować całkowite zużycie pamięci permgowej klasy?
- 11. Jak oszacować czasy pracy nad nową technologią?
- 12. PHP Jak dodać do końca tablicy?
- 13. Jak dopasować ciąg do końca pliku tekstowego?
- 14. Bash, jak dodać słowo do końca wiersza?
- 15. Jak dodać linie do końca pliku - linux
- 16. Dokładnie zmierzono czas, jaki upłynął zegar ścienny w .NET
- 17. Definicja końca strony a definicja końca strony
- 18. Konwersja z NStimeInterval do CMTime dokładnie
- 19. Substring przejść do końca ciągu
- 20. Serwer SQL pozostały przyłączaniu się
- 21. Przewiń do końca ScrolledWindow/TextView
- 22. Czym dokładnie jest czas procesora w menedżerze zadań?
- 23. Selen: Przewiń do końca strony
- 24. Jak obliczyć czas trwania?
- 25. Uzyskanie wskaźnik do końca tablicy
- 26. Co to jest pozostały czas na głównym wykresie kołowym Eclipse Memory Analyzer?
- 27. jquery czekając na $ .each do końca
- 28. Vim: Idź do początku/końca następnej metody
- 29. Komenda AWK do wydrukowania do końca wiersza
- 30. Jak dodać czas do odliczania?
Proste, ale wygląda dobrze! – mpen
Niejasne informacje o pozostałym czasie pobierania. Potrafi obliczyć średnią prędkość z próbkowania ruchomego. – byJeevan