2010-05-06 6 views

답변

101

exponential moving average은 위대합니다. 평균을 매끄럽게하는 방법을 제공하므로 새 샘플을 추가 할 때마다 이전 샘플이 전반적인 평균보다 중요하게 줄어 듭니다. 그들은 여전히 ​​고려되고 있지만, 그 중요성은 기하 급수적으로 떨어집니다. 그리고 그것은 "움직이는"평균이기 때문에, 당신은 하나의 수를 유지해야합니다. 화학식은 다음과 같을 것이다 측정 다운로드 속도의 맥락에서

:

averageSpeed = SMOOTHING_FACTOR * lastSpeed + (1-SMOOTHING_FACTOR) * averageSpeed; 

SMOOTHING_FACTOR는이 번호가 빠른 오래된 샘플들은 버려진 다 이상 0과 1 사이의 값이다. 수식에서 볼 수 있듯이 SMOOTHING_FACTOR이 1 일 때 단순히 마지막 관찰 값을 사용합니다. SMOOTHING_FACTOR이 0 일 때 averageSpeed은 변경되지 않습니다. 그래서, 사이에 뭔가를 원한다면, 그리고 일반적으로 적절한 값을 얻으려면 낮은 가치. 나는 0.005가 평균 다운로드 속도에 대해 꽤 좋은 스무딩 값을 제공한다는 것을 발견했다.

lastSpeed은 마지막으로 측정 된 다운로드 속도입니다. 매초마다 타이머를 실행하여이 값을 얻을 수 있습니다. 마지막으로 실행 한 이후에 다운로드 한 바이트 수를 계산할 수 있습니다.

averageSpeed은 분명히 남은 예상 시간을 계산하는 데 사용하려는 숫자입니다. 처음 측정 한 lastSpeed 측정 값으로 초기화하십시오.

+2

간단하지만 좋아 보인다! – mpen

+0

다운로드 할 수있는 남은 시간이 명확하지 않습니다. 이동 샘플링의 평균 속도를 계산할 수 있습니다. – byJeevan

5

당신이 할 수있는 최선의 방법은 평균 다운로드 속도 (지금까지 다운로드 한 시간과 다운로드 한 시간을 나눈 ​​값)로 나머지 파일 크기를 나누는 것입니다. 이것은 조금씩 변동하지만 더 오래 다운로드 할수록 더 안정적 일 것입니다.

+0

지난 24 시간 동안 사용자가 다운로드하는 경우를 생각해보십시오. 분전에는 인터넷 연결이 끊어졌으며 사용자는 다운로드 시간을 무한하지 않게 보았습니다. 그게 버그인가요? – TiansHUo

+0

연결이 끊어진 경우 다운로드 시간이 무한대가됩니다. –

+1

예 ... 나는이 솔루션을 좋아하지 않는다고 생각합니다. 그것은 몇 시간 전에 다운로드 속도에 너무 많은 강조를 둔다. 특히 나를 괴롭히는 이유는 다운로드 시작의 처음 몇 초 가량이 기울어 져 (더 많은 씨앗에 연결되는 급류) 또는 속도가 느려져서 (쇼의 파워 보트가 벗겨짐) 꽤 불안정하기 때문에 완전히 할인해야한다고 생각합니다. – mpen

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

즉 가중치를 적용하여 최근 시간을 강조합니다. – mpen

+0

@mark, 예, 얻을 수 있습니다. – TiansHUo

+0

+1이 덥습니다! –

2

Ben Dolman의 답변에서 알고리즘 내에서 변동을 계산할 수도 있습니다. 더 부드럽지만 avarage 속도를 예측합니다. 이런

예시 :

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; 

변동 여부, 그것은 예측 depencySpeed ​​적합한 값은 모두 같은 다른 안정 될 것이다; 인터넷 속도에 따라 조금만 놀아야합니다. 이 설정은 avarage speed가 600 kB/s 인 동안 완벽합니다. 0에서 1 MB까지 변동합니다.

+1

아마도 이전 다운로드에 대한 예측을 기반으로 할 수 있을까요? 초과 근무는 더 정확해질 것입니다. – mpen

3

나는 현재 처리량이 미리 정의 된 범위를 벗어 났을 때 재설정으로 이동 평균을 사용하는 디스크 이미징 및 멀티 캐스팅 프로그램의 남은 시간을 예측하기 위해 몇 년 전에 알고리즘을 작성했습니다. 급격한 일이 발생하지 않으면 일을 원활하게 유지할 수 있습니다. 그런 다음 신속하게 조정 한 다음 다시 이동 평균으로 되돌아갑니다.

enter image description here

그 예 차트에서 두꺼운 파란색 선은 시간이 지남에 따라 실제 처리량입니다 : 여기 예를 들어 차트를 참조하십시오. 전송의 첫 번째 절반 동안 낮은 처리량을 확인하고 후반에 극적으로 점프. 주황색 선은 전반적인 평균입니다. 끝내기까지 걸리는 시간에 대한 정확한 예측을 할 수있을 정도로 멀리 조정하지 않는다는 점에 유의하십시오. 회색 선은 이동 평균입니다.마지막 N 개의 데이터 포인트의 평균 -이 그래프에서 N은 5이지만 실제로는 충분히 부드럽게하기 위해 N을 더 크게해야 할 수도 있음). 더 빨리 회복하지만 조정하는 데는 시간이 걸립니다. 더 큰 N이 더 많은 시간이 걸릴 것입니다. 따라서 데이터에 잡음이 많은 경우 N은 더 커야하며 복구 시간은 길어집니다.

녹색 선은 내가 사용한 알고리즘입니다. 이동 평균과 마찬가지로 진행되지만 데이터가 미리 정의 된 범위 (밝은 파란색과 노란색 선으로 표시) 밖으로 이동하면 이동 평균을 재설정하고 즉시 점프합니다. 사전 정의 된 범위는 표준 편차를 기반으로 할 수도 있으므로 데이터가 자동으로 얼마나 시끄러운지를 조정할 수 있습니다. 저는이 값들을 Excel에 던져서이 답변을 도표로 그려서 완벽하지는 않지만 아이디어를 얻었습니다.

이 알고리즘을 사용하면 남은 시간을 예측하는 데 실패 할 수 있습니다. 결론은 데이터가 어떻게 동작하는지 예상하고 이에 따라 알고리즘을 선택하는 일반적인 아이디어가 필요하다는 것입니다. 내 알고리즘은 내가 본 데이터 세트에서 잘 작동 했으므로 계속 사용했습니다.

다른 중요한 팁은 일반적으로 개발자가 진행률 막대 및 시간 예상 계산에서 설정 및 해체 시간을 무시한다는 점입니다. 이로 인해 오랜 시간 (캐시가 플러시되거나 다른 정리 작업이 진행되는 동안) 자리를 비 롯한 영원한 99 % 또는 100 % 진행률 표시 줄 또는 디렉토리 검색이나 기타 설정 작업이 발생할 때의 야생 초기 예상치, 시간 발생 모든 진행률을 얻지는 못합니다. 설정 및 해체 시간을 포함하는 여러 가지 테스트를 실행하고 평균 시간 또는 작업 크기를 기준으로 추정 시간을 계산하고 그 시간을 진행률 막대에 추가 할 수 있습니다. 예를 들어, 작업의 처음 5 %는 설정 작업이고 마지막 10 %는 분해 작업이며 중간 85 %는 다운로드 또는 반복되는 모든 반복 프로세스입니다. 이것은 많은 도움이 될 수 있습니다.

+1

유용한 팁! 공유해 주셔서 감사합니다. – mpen