Resolvimos un problema similar de la siguiente manera. No estábamos interesados en qué tan rápida fue la descarga durante el tiempo total de , solo aproximadamente cuánto tiempo se esperaba que tomara según la actividad reciente, pero, como dices, no es tan reciente que las cifras estarían saltando por todos lados .
La razón por la que no estábamos interesados en el intervalo de tiempo completo fue que una descarga podría ser de 1M/s durante media hora y luego cambiar a 10M/s durante los siguientes diez minutos. Esa primera media hora arrastrará la velocidad promedio bastante severamente, a pesar del hecho de que ahora estás avanzando bastante rápido.
Creamos un búfer circular con cada celda conteniendo la cantidad descargada en un período de 1 segundo. El tamaño del búfer circular era 300, lo que permite 5 minutos de datos históricos, y cada celda se inicializó a cero.
También mantuvimos un total (la suma de todas las entradas en el búfer, así que también inicialmente cero) y el recuento (cero, obviamente).
Cada segundo, queremos averiguar cómo se habían descargado la cantidad de datos desde el último segundo y luego:
- restar la celda actual del total.
- ponga la cifra actual en esa celda y avance el puntero de la celda.
- suma esa cifra actual al total.
- aumentar el recuento si no era ya 300.
- actualizar la figura que se muestra al usuario, en función del total/recuento.
Básicamente, en pseudo-código:
def init (sz):
buffer = new int[sz]
for i = 0 to sz - 1:
buffer[i] = 0
total = 0
count = 0
index = 0
maxsz = sz
def update (kbps):
total = total - buffer[index] + kbps
buffer[index] = kbps
index = (index + 1) % maxsz
if count < maxsz:
count = count + 1
return total/count
Puede cambiar la resolución de (1 segundo) y la historia (300) para adaptarse a su situación, pero nos encontramos a 5 minutos fue más que tiempo suficiente para que se suavizó las irregularidades pero aún se ajustó gradualmente a cambios más permanentes de manera oportuna.
No creo que un promedio uniforme lo reduzca; He visto mi actualización de Ubuntu descargar medio giga de archivos, y noté un patrón muy claro: los archivos de mayor tamaño tienen una velocidad mucho más rápida (hasta 5 veces o incluso 10 veces) que los archivos más pequeños. Si hace suposiciones sobre el protocolo utilizado (por ejemplo, ftp, http), entonces debería poder deducir por qué ocurre esta variación (observe que no es fácil debido a todos los detalles involucrados, pero tampoco imposible). Básicamente, con el paso del tiempo, trataría de mejorar la función que predice la velocidad y el tiempo de descarga en función del tamaño. –