2009-11-24 9 views
10

Mientras se muestra el estado de descarga en una ventana, no tengo información como:Algo para un estable 'download-tiempo restante' en una ventana de descarga

1) Tamaño total del archivo (f)

2) tamaño del archivo descargado (f ')

3) velocidad (s) descarga actual

Un cálculo de tiempo restante sería ingenuo (f-f')/(s), pero este valor es la forma-a- tembloroso (quedan 6m/2h restante/5m restante! deja vu ?! :)

¿Habría un cálculo que sea a la vez más estable y no extremadamente incorrecto (mostrando 1 h, incluso cuando la descarga está por completarse)?

+0

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

Respuesta

13

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.

+0

no debería ser: _count = ** min ** (maxsz, count + 1) _? – Felix

+0

@ phix23: buena captura. No puedo creer que nadie se haya dado cuenta de esto durante más de un año. Ann lo modifiqué para que funcione correctamente y eliminé por completo la dependencia de una función. – paxdiablo

+1

tampoco lo puedo creer, tal vez soy el primero que realmente usé este código – Felix

10

Smooth s (exponential moving avg .o similar).

+0

Gracias! Parece un buen lugar para comenzar. – Abhishek

+0

Esto es realmente solo filtro de paso bajo. –

0

Por qué no calcular la velocidad de descarga como un promedio en toda la descarga, es decir:

s = f'/elapsed time 

De esa manera sería suavizar el paso del tiempo.

+3

piensa en una descarga de una hora de duración a 100kb/s ha descargado el 50% de la misma. Luego, comenzó otra descarga y la velocidad baja 50 kb/s, su indicador de tiempo de descarga estará mal hasta el final de su descarga. Dirá que quedan 30 minutos, mientras que claramente nos llevará a descargar el resto. –

+2

En realidad, no se puede predecir en absoluto cuánto tardará la segunda descarga. Esa segunda descarga puede ser de 50 KB en total. En ese caso, mostraría 1 hora restante durante los 8 segundos, luego de lo cual rebota a 30 minutos. La predicción es difícil, especialmente cuando se trata del futuro: P – MSalters

4

Prefiero usar la velocidad promedio durante los últimos 10 segundos y dividir la parte restante con eso. La división de la velocidad actual a demasiado inestable mientras se divide a la media del progreso total no puede manejar los cambios de velocidad permanentes (como que se está iniciando otra descarga).

Cuestiones relacionadas