2011-10-06 16 views
15

tl; dr: Quiero predecir la finalización de la copia de archivo. ¿Cuáles son los buenos métodos dados el tiempo de inicio y el progreso actual?¿Cuáles son algunos buenos enfoques para predecir el tiempo de finalización de un proceso largo?

En primer lugar, soy consciente de que esto no es en absoluto un problema simple, y que predecir el futuro es difícil de hacer bien. Para el contexto, estoy tratando de predecir la finalización de una copia de archivo larga.

Enfoque actual:

Por el momento, estoy usando una fórmula bastante ingenua de que se me ocurrió a mí mismo: (ETC representa hora prevista de finalización)

ETC = currTime + elapsedTime * (totalSize - sizeDone)/sizeDone 

Estos trabajos en el supuesto de que los archivos restantes que se copiarán lo harán a la velocidad de copia promedio hasta el momento, lo que puede o no ser una suposición realista (se trata de archivos de cinta aquí).

  • PRO: El ETC va a cambiar poco a poco, y se vuelve más y más preciso que el proceso llega a su fin.
  • CON: No reacciona bien a eventos inesperados, como la copia de archivos se atasque o acelerar rápidamente.

Otra idea:

La siguiente idea que tenía era para mantener un registro de los avances en los últimos n segundos (o minutos, teniendo en cuenta que estos archivos se supone que deben tomar horas), y acaba de hacer algo como:

ETC = currTime + currAvg * (totalSize - sizeDone) 

Esto es un poco lo contrario del primer método en que:

  • PRO: Si la velocidad cambia rápidamente, el ETC se actualizará rápidamente para reflejar el estado actual de las cosas.
  • CON: El ETC puede saltar de un lado a si la velocidad es inconsistente.

Finalmente

Me recuerda a los temas de ingeniería de control que hice en la universidad, donde el objetivo es esencialmente para tratar de conseguir un sistema que reacciona rápidamente a los cambios repentinos, pero no es inestable y loca.

Dicho esto, la otra opción que podía pensar sería calcular el promedio de las dos anteriores, quizás con algún tipo de ponderación:

  • de peso el primer método más si la copia tiene una velocidad promedio bastante constante a largo plazo, incluso si salta un poco localmente.
  • Pese el segundo método más si la velocidad de copia es impredecible, y es probable que haga cosas como acelerar/desacelerar durante períodos prolongados, o detener por completo por períodos prolongados.

lo que realmente estoy pidiendo es:

  • Cualquier alternativa se acerca a los dos que he dado.
  • Si y cómo combinaría varios métodos diferentes para obtener una predicción final.
+1

He hecho algo similar con el ajuste de curvas. Pero es alta y solo funciona si no hay demasiado ruido en los datos de progreso existentes. – Mysticial

+0

Algunas sugerencias excelentes aquí en todas las respuestas. Difícil elegir uno "mejor", pero creo que iré con la respuesta de @ aix para el enfoque empírico y los enlaces útiles. –

Respuesta

8

Si considera que la exactitud de la predicción es importante, la manera de ir sobre sobre la construcción de un modelo predictivo es el siguiente:

  1. recoger algunas medidas del mundo real;
  2. ellos se dividieron en tres conjuntos disjuntos: de formación, validación y prueba de ;
  3. proponga algunos modelos predictivos (usted ya tiene dos más una mezcla) y ajústelos usando el conjunto de entrenamiento ;
  4. verificar el rendimiento predictivo de los modelos en la validación establecer y elegir el que tenga el mejor rendimiento;
  5. utilice la prueba establecida para evaluar el error de predicción fuera de muestra del modelo elegido.

Me arriesgaría a decir que un linear combination de su modelo actual y el "promedio de los últimos n segundos" realizaría bastante bien para el problema en cuestión. Los pesos óptimos para la combinación lineal se pueden ajustar usando linear regression (un trazador de líneas en R).

Un recurso excelente para estudiar métodos estadísticos de aprendizaje es The Elements of Statistical Learning por Hastie, Tibshirani y Friedman. No puedo recomendar ese libro lo suficiente.

Por último, su segunda idea (promedio en los últimos n segundos) intenta medir la velocidad instantánea. Una técnica más robusta para esto podría ser el uso de la Kalman filter, cuyo propósito es exactamente esto:

Su propósito es usar mediciones observadas con el tiempo, que contiene ruido (variaciones aleatorias) y otras inexactitudes, y producir valores que tienden a estar más cerca de los valores verdaderos de las medidas y de sus valores calculados asociados.

La ventaja principal de usar el filtro de Kalman en lugar de un fijo n -segundo ventana deslizante es que es adaptativo: se utilizará automáticamente una ventana de promediado más largo cuando las mediciones de saltar de un lado a que cuando están estables .

+0

Me gusta el enfoque empírico aquí. Los enlaces también parecen útiles. –

3

he implementado dos soluciones diferentes para hacer frente a este problema:

  1. El ETC para la transferencia de corriente en el momento de inicio se basa en un valor histórico velocidad.Este valor se refina después de cada transferencia. Durante la transferencia, calculo un promedio ponderado entre los datos históricos y los datos de la transferencia actual, de modo que cuanto más cerca esté del final, más peso se le da a los datos reales de la transferencia.

  2. En lugar de mostrar un solo ETC, muestre un rango de tiempo. La idea es calcular el ETC a partir de los últimos 'n' segundos o minutos (como su segunda idea). Llevo un registro de los mejores y peores promedios de casos y calculo un rango de posibles ETC. Esto es algo confuso para mostrar en una GUI, pero está bien mostrarlo en una aplicación de línea de comandos.

+0

Buenas sugerencias. Estos enfoques son un poco diferentes, no algo en lo que hubiera pensado. –

4

En mi humilde opinión, las malas implementaciones de ETC son ampliamente usados ​​en exceso, lo que nos permite have a good laugh. A veces, puede ser mejor para mostrar hechos en lugar de estimaciones, como:

  • 5 de 10 archivos se han copiado
  • 10 de 200 MB se han copiado

o mostrar hechos y una estimación, y dejar en claro que es solo una estimación. Pero no mostraría solo una estimación.

Cada usuario sabe que los ETC a menudo carecen de sentido, y entonces es difícil distinguir entre ETC significativos y ETCs sin sentido, especialmente para usuarios inexpertos.

+0

Sí, cualquiera que sea el método que use, definitivamente mostraré el progreso en las cifras sin procesar también. –

3

hay dos cosas a considerar aquí:

  • la estimación exacta
  • cómo presentarlo al usuario

1. En la estimación

Aparte de las estadísticas enfoque, una manera simple de tener una buena estimación de la velocidad actual mientras se borran algunos ruidos o picos es tomar un wei enfoque ghted.

Ya experimentó con la ventana deslizante, la idea aquí es tomar una ventana deslizante bastante grande, pero en lugar de una media simple, dando más peso a medidas más recientes, ya que son más indicativas de la evolución (un poco como un derivado).

Ejemplo: Supongamos que tiene 10 ventanas anteriores (x0 más reciente, x9 menos reciente), entonces se podría calcular la velocidad:

Speed = (10 * x0 + 9 * x1 + 8 * x2 + ... + x9)/(10 * window-time)/55 

Cuando usted tiene una buena evaluación de la velocidad probable, entonces usted está cerca de obtener un buen tiempo estimado.

2. En la presentación

Lo principal a recordar aquí es que desea una experiencia de usuario agradable, y no un frente científico.

Los estudios han demostrado que los usuarios reaccionaron muy mal a la desaceleración y muy positivamente a la aceleración. Por lo tanto, una buena barra de progreso/tiempo estimado debería ser conservador en las estimaciones presentadas (reservando el tiempo para una posible ralentización) al principio.

Una manera simple de obtener eso es tener un factor que es un porcentaje de la terminación, que se utiliza para ajustar el tiempo restante estimado. Por ejemplo:

real-completion = 0.4 
presented-completion = real-completion * factor(real-completion) 

Dónde factor es tal que factor([0..1]) = [0..1], factor(x) <= x y factor(1) = 1. Por ejemplo, la función cúbica produce una agradable aceleración hacia el tiempo de finalización. Otras funciones podrían usar una forma exponencial 1 - e^x, etc ...

+0

Ideas más interesantes aquí que yo no hubiera pensado. –

Cuestiones relacionadas