2009-12-10 11 views
14

Todos nos hemos burlado del diálogo "X minutos restantes" que parece demasiado simplista, pero ¿cómo podemos mejorarlo?Estimación/previsión del tiempo de finalización de la descarga

Efectivamente, la entrada es el conjunto de velocidades de descarga hasta la hora actual, y tenemos que usar esto para estimar el tiempo de finalización, tal vez con una indicación de certeza, como '20 -25 mins restantes 'usando alguna Y % intervalo de confianza.

El código que hizo esto podría colocarse en una pequeña biblioteca y utilizarse en proyectos de todo, así que ¿es realmente tan difícil? ¿Como lo harias? ¿Qué ponderación le daría a las velocidades de descarga anteriores?

¿O ya existe algún código fuente abierto?

Editar: En resumen:

  1. mejorar el tiempo de finalización estimada a través de una mejor algo/filtro etc.
  2. Proporcionar intervalo en lugar de una sola vez ('1h45-2h30 minutos'), o simplemente limitar la precisión ('alrededor de 2 horas').
  3. Indique cuando el progreso se ha estancado, aunque si el progreso se detiene constantemente y luego continúa, deberíamos poder tratar con eso. Tal vez 'aproximadamente 2 horas, actualmente estancadas'
+4

obligatorio referencia xkcd: http://www.xkcd.com/612/ – jason

+0

duplicado de http://stackoverflow.com/questions/933242/smart-progress-bar-eta-computation –

Respuesta

4

No hay que confundir a los usuarios proporcionando más información de la que necesitan. Estoy pensando en el intervalo de confianza. Saltarlo.

Los tiempos de descarga de Internet son muy variables. El microondas interfiere con WiFi. El uso varía según la hora del día, el día de la semana, las vacaciones y los lanzamientos de nuevos juegos emocionantes. El servidor puede estar muy cargado en este momento. Si lleva su computadora portátil a la cafetería, los resultados serán diferentes a los de su casa. Por lo tanto, probablemente no pueda confiar en los datos históricos para predecir el futuro de las velocidades de descarga.

Si no puede estimar con exactitud el tiempo restante, entonces no le miente a su usuario al ofrecer dicha estimación.

Si sabe la cantidad de datos que se deben descargar, puede proporcionar% completado el progreso.

Si no sabe nada, proporciona un "latido" - una pieza de interfaz de usuario en movimiento que muestra al usuario que las cosas están funcionando, incluso a través de usted no sabe cuánto tiempo permanece.

+1

A no-instantánea pero -la medición de la velocidad máxima (últimos 5 segundos?) es bastante útil para decir si va bien. Digo no porque me pasó más de una vez ver velocidades de descarga estimadas en el rango de Tera/Petabyte por segundo :) – Agos

+0

El objetivo del asunto es en gran parte * mejorar * la información dada al usuario. Por lo tanto, no decir la mentira de que la estimación es precisa dada una precisión excesiva ("quedan 24 min. 4 segundos"), sin decir que no variará al dar un valor único en lugar de un intervalo, etc. Ciertamente, si el estimador encuentra la entradas demasiado variables puede indicar eso en su lugar. –

0

He considerado esto de vez en cuando. La respuesta comienza siendo conservador al calcular la velocidad de transferencia actual (y, por lo tanto, futura) e incluye el promedio en períodos más largos, para obtener estimaciones más estables. Tal vez el filtrado de paso bajo muestra el tiempo que se muestra, de modo que uno no obtiene saltos entre 2 minutos y 2 días.

No creo que un intervalo de confianza vaya a ser útil. La mayoría de la gente no podría interpretarlo, y simplemente mostraría más cosas que son una suposición.

+0

Creo que una simple indicación de confianza funcionaría, como '20 -25 mins '. Por lo menos, valdría la pena limitar la precisión del valor suministrado: 'aproximadamente 2 horas' en lugar de '2 horas y 16 minutos'. –

8

Me pregunto, ¿una técnica de estimación de estado produciría buenos resultados aquí? Algo como un filtro de Kalman?

Básicamente puede predecir el futuro mirando su modelo actual y cambiar el modelo en cada paso de tiempo para reflejar los cambios en el mundo real. Creo que este tipo de técnica se usa para estimar el tiempo que queda en la batería de tu computadora portátil, que también puede variar según el uso, la edad de la batería, etc. '

ver http://en.wikipedia.org/wiki/Kalman_filter para una descripción más detallada del algoritmo.

El filtro también da una medida de la varianza, que podría ser utilizado para indicar la confianza de la estimación (acabase, como se ha mencionado en otras respuestas, tal vez no sea la mejor idea de mostrar esto al usuario final)

¿Alguien sabe si esto se utiliza realmente en alguna parte para la estimación de descarga (o copia de archivo)?

+0

Kalman requiere que le proporcione un modelo, no crea uno. Simplemente usa el modelo que le da, y las mediciones ruidosas, para tratar de descubrir el estado actual (oculto). –

+0

Por supuesto que necesita un modelo, puede comenzar con uno simple donde suponga que la velocidad de descarga es constante, y el filtro adaptará el valor de la tasa de descarga de acuerdo con la evidencia. – Yair

12

En términos más generales, creo que está buscando una manera de dar una medida instantánea de la velocidad de transferencia, que generalmente se obtiene en promedio durante un período pequeño.

El problema en general es que para ser reactivo, el período suele ser extremadamente pequeño, lo que conduce al efecto yoyo.

Propongo un esquema muy simple, modelémoslo.

Piense en una velocidad de curva (y) en el tiempo (x).

  1. Velocidad instantánea, no es más que leer y para la corriente x (x0).

  2. la velocidad media, no es más que Integral(f(x), x in [x0-T,x0])/T

  3. el esquema que propongo es aplicar un filtro, para dar más peso a los últimos momentos, sin dejar de tomar en cuenta los últimos momentos.

Se puede implementar fácilmente como g(x,x0,T) = 2 * (x - x0) + 2T que es un simple triángulo de T. superficie

y ahora se puede calcular Integral(f(x)*g(x,x0,T), x in [x0-T,x0])/T, que debería funcionar debido a que ambas funciones son siempre positivos.

Por supuesto que podría tener un g diferente siempre que siempre sea positivo en el intervalo dado y que su integral en el intervalo sea T (de modo que su propio promedio sea exactamente 1).

La ventaja de este método es que debido a que le da más peso a los eventos inmediatos, puede permanecer bastante reactivo incluso si considera intervalos de tiempo más largos (para que el promedio sea más preciso y menos susceptible a contratiempos).

Además, lo que pocas veces he visto, pero creo que proporcionar estimaciones más precisas sería correlacionar el tiempo utilizado para el cálculo de la media para el tiempo restante estimado:

  • si descargo un archivo 5ko, que va para ser cargado en un instante, sin necesidad de estimar
  • si descargo un archivo de 15 Mo, tomará entre 2 minutos aproximadamente, por lo que me gustaría que las estimaciones diga ... ¿cada 5 segundos?
  • si descargo un archivo 1.5 Go, tomará ... aproximadamente 200 minutos (con la misma velocidad) ...es decir 3h20m ... ¿tal vez que una estimación de cada minuto sería suficiente?

Por lo tanto, cuanto más tiempo tarde en descargarse, menos reactivo necesito ser, y más puedo promediar. En general, diría que una ventana podría cubrir el 2% del tiempo total (tal vez con excepción de las primeras estimaciones, porque las personas aprecian la retroalimentación inmediata). Además, es suficiente indicar el progreso en porcentaje total a la vez. Si la tarea es larga, estaba dispuesto a esperar de todos modos.

+3

Excelente, pero la integral probablemente esté sobreinyectada. Vamos a llamarlo promedio ponderado de algunas muestras recientes. :-) –

+4

@Konrad: cierto, era para el rigor matemático y se anima a las implementaciones reales a aproximarse ^^ –

2

Mejorando el tiempo estimado en sí: Intuitivamente, supongo que la velocidad de la conexión de red es una serie de valores aleatorios alrededor de una velocidad media temporal: las cosas avanzan a una velocidad y luego se ralentizan o aceleran repentinamente.

Una opción, entonces, podría ser ponderar el conjunto anterior de velocidades de forma exponencial, de modo que los valores más recientes obtengan la mayor ponderación. De esta forma, a medida que la velocidad media anterior se mueve más hacia el pasado, su efecto sobre la media actual se reduce.

Sin embargo, si la velocidad fluctúa de forma aleatoria, puede valer la pena aplanar la parte superior de la exponencial (por ejemplo, utilizando Gaussian filter), para evitar demasiada fluctuación.

En resumen, estoy pensando en medir la desviación estándar (tal vez limitada a los últimos N minutos) y usar eso para generar un filtro Gaussiano que se aplica a las entradas, y luego limitar la precisión citada usando el estándar desviación.

Sin embargo, ¿cómo limitaría el cálculo de la desviación estándar a los últimos N minutos? ¿Cómo sabes cuánto tiempo usar?

Alternativamente, existen posibilidades de reconocimiento de patrones para detectar si alcanzamos una velocidad estable.

Cuestiones relacionadas