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