2011-08-31 3 views
1

이것은 주로 성능 문제입니다. 과거 N (30?) 값의 현재 평균을 얻는 데 도움이됩니다. 여기서 컨텍스트는 서버에서 지난 N 개의 데이터 요청에 대한 평균 실행 시간을 모니터링하는 것입니다. 분명한 해결책은 모든 N 요청을 읽고 테이블로 작성한 모든 과거 N 요청을 기록하는 것입니다. 문제의 데이터 요청과 관련하여 실적 조회 생성최근 평균, 모든 데이터의 전체 로깅 사용 안 함

이것은 주로 측정 수단으로 사용되며 완벽한 실행 견적이 아니므로 질문이 있습니까? 가장 효과적인 방법으로이 문제를 해결하십시오. 이 솔루션은 언어 중립적 일 수 있지만

, 내가 마지막으로 N 값을 저장하는 대신 PHP :

답변

1

을에서 구현 될 것이며, 미리 정의 된 버킷 크기 "버킷"에서 당신의 가치를 구성하고 각 버킷에 대한 버킷의 모든 값의 합계 만 저장하십시오.

버킷이 가득 차면 가장 오래된 버킷을 삭제할 수 있습니다. (이 작업을 수행하는 가장 좋은 방법은 링 버퍼 일 것입니다.)

이렇게하면 BUCKET_SIZE의 계수로 메모리 사용량을 줄일 수 있지만 분명히 평균은 마지막 N 값을 초과하지는 않습니다. 마지막 N에서부터 N + BUCKET_SIZE.

+0

평균은 최근 버킷을 기반으로합니다 ... 약간의 지연이 있지만 (버킷을 채울 데이터의 경우) 분명히 훨씬 작은 면적입니다. – PicoCreator

+0

아니요, 평균은 "반 전체"를 포함한 모든 버킷의 평균 - 모든 버킷에 대한 합을 계산하고'(BUCKET_SIZE * NUMBER_OF_FULL_BUCKETS) + NUMBER_OF_ITEMS_IN_HALF_FULL_BUCKET'으로 나눕니다. 그런 식으로해도 지연은 없지만 양동이가 가득 찰 때마다 가장 오래된 값이 새로운 빈 값으로 바뀔 때마다 약간의 "점프"가 가치가있을 수 있습니다. – ChristophK