2010-05-06 22 views

Odpowiedz

101

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.

+2

Proste, ale wygląda dobrze! – mpen

+0

Niejasne informacje o pozostałym czasie pobierania. Potrafi obliczyć średnią prędkość z próbkowania ruchomego. – byJeevan

5

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ć.

+0

, 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

+0

Czas pobierania będzie miał tendencję do nieskończoności, jeśli połączenie pozostanie zerwane. –

+1

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

7
speed=speedNow*0.5+speedLastHalfMinute*0.3+speedLastMinute*0.2 
+1

tj. Ważony, kładąc nacisk na bardziej aktualny czas. – mpen

+0

@mark, yeah masz to – TiansHUo

+0

+1 to jest gorący! –

2

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.

+1

Być może wtedy możesz oprzeć swoją prognozę na poprzednich pobraniach? Nadgodziny będą bardziej dokładne. – mpen

3

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:

enter image description here

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.

+1

Dobre rady! Dziękuję za podzielenie się. – mpen

Powiązane problemy