2011-10-06 9 views
15

tl; dr: Voglio prevedere il completamento della copia dei file. Quali sono i buoni metodi dati l'ora di inizio e gli attuali progressi?Quali sono alcuni buoni approcci per prevedere il tempo di completamento di un lungo processo?

In primo luogo, sono consapevole che questo non è affatto un problema semplice e che prevedere il futuro è difficile da fare bene. Per il contesto, sto provando a prevedere il completamento di una lunga copia di file.

approccio attuale:

Al momento, sto utilizzando una formula piuttosto ingenua che mi è venuta con me stesso: (ETC sta per Tempo stimato di completamento)

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

questo funziona partendo dal presupposto che i file rimanenti da copiare lo faranno alla velocità media della copia fino ad ora, il che può o non può essere una supposizione realistica (occupandosi di archivi di nastri qui).

  • PRO: L'ETC cambierà gradualmente, e diventa sempre più preciso in quanto il processo si avvicina al completamento.
  • CON: Non reagisce bene a eventi imprevisti, come la copia di file che si blocca o si accelera rapidamente.

Un'altra idea:

L'idea successiva che ho avuto è stato quello di tenere un registro dei progressi negli ultimi n secondi (o minuti, dato che questi archivi sono tenuti a richiedere ore), e basta fare una cosa del genere:

ETC = currTime + currAvg * (totalSize - sizeDone) 

Questa è una specie di l'opposto del primo metodo in quanto:

  • PRO: Se la velocità cambia rapidamente, l'ETC si aggiornerà rapidamente per riflettere lo stato attuale delle cose.
  • CON: L'ETC può saltare molto se la velocità è incoerente.

Infine

Mi viene in mente dei soggetti di ingegneria di controllo che ho fatto presso UNI, in cui l'obiettivo è sostanzialmente quello di cercare di ottenere un sistema che reagisce rapidamente ai cambiamenti improvvisi, ma non è instabile e pazzo.

Detto questo, l'altra opzione che riuscivo a pensare sarebbe quello di calcolare la media di entrambi di quanto sopra, magari con qualche tipo di ponderazione:

  • peso il primo metodo di più se la copia ha un velocità media a lungo termine abbastanza consistente, anche se salta un po 'localmente.
  • Peso il secondo metodo di più se la velocità di copia è imprevedibile ed è probabile che faccia cose come accelerare/rallentare per lunghi periodi o fermarsi del tutto per lunghi periodi.

Quello che sto veramente chiedendo è:

  • Qualsiasi approcci alternativi ai due ho dato.
  • Se e come combinare diversi metodi per ottenere una previsione finale.
+1

Ho fatto qualcosa di simile che riguarda l'adattamento della curva. Ma è alto-overhead e funziona solo se non c'è troppo rumore nei dati di avanzamento esistenti. – Mysticial

+0

Alcuni ottimi suggerimenti qui su tutte le risposte. È difficile scegliere un 'migliore', ma penso che andrò con la risposta di @ aix per l'approccio empirico e i link utili. –

risposta

8

Se ritieni che la precisione della previsione è importante, il modo per andare su di costruire un modello predittivo è la seguente:

  1. raccogliere alcune misure reali;
  2. dividerli in tre insiemi disgiunti: formazione, convalida e prova;
  3. inventare alcuni modelli predittivi (ne hai già due più un mix) e montarli utilizzando il set di formazione;
  4. controllare le prestazioni predittive dei modelli sulla convalida e selezionare quella che offre il rendimento migliore;
  5. utilizzare il test impostato per valutare l'errore di previsione fuori dal campione del modello scelto.

mi piacerebbe azzardare un'ipotesi che un linear combination del modello attuale e il "medio degli ultimi n secondi" avrebbe compiuto abbastanza bene per il problema in questione. I pesi ottimali per la combinazione lineare possono essere montati usando linear regression (un liner in R).

Una risorsa eccellente per lo studio dei metodi di apprendimento statistico è The Elements of Statistical Learning di Hastie, Tibshirani e Friedman. Non posso raccomandare questo libro abbastanza bene.

Infine, la seconda idea (media degli ultimi n secondi) tenta di misurare la velocità istantanea. Una tecnica più robusta per questo potrebbe essere quella di utilizzare il Kalman filter, il cui scopo è proprio questo:

Il suo scopo è quello di utilizzare le misurazioni rilevate nel tempo, contenente rumore (variazioni casuali) e altre imprecisioni, e produrre valori che tendono ad essere più vicini ai valori reali delle misurazioni e ai valori calcolati associati a .

Il vantaggio principale di utilizzare il filtro di Kalman, piuttosto che una fissa n -secondo finestra scorrevole è che è adattivo: userà automaticamente una finestra di una media di più lungo quando le misurazioni saltano in giro un sacco di quando sono stabili .

+0

Mi piace l'approccio empirico qui. Anche i collegamenti sembrano utili. –

3

ho implementato due diverse soluzioni per affrontare questo problema:

  1. L'ETC per il trasferimento di corrente in fase di avvio si basa su un valore storico di velocità.Questo valore viene raffinato dopo ogni trasferimento. Durante il trasferimento computo una media ponderata tra i dati storici e i dati del trasferimento corrente, in modo che quanto più ci si avvicina alla fine, tanto maggiore è il peso attribuito ai dati effettivi dal trasferimento.

  2. Invece di mostrare un singolo ETC, mostrare un intervallo di tempo. L'idea è di calcolare l'ETC dagli ultimi secondi o secondi o secondi (come la tua seconda idea). Tengo traccia delle medie dei casi migliori e peggiori e calcola una gamma di possibili ETC. Questo è un po 'di confusione da mostrare in una GUI, ma va bene mostrarlo in una app a linea di comando.

+0

Bei suggerimenti. Questi approcci sono un po 'diversi, non qualcosa a cui avrei pensato. –

4

IMHO, cattive implementazioni di ETC sono selvaggiamente abusato, che ci permette di have a good laugh. A volte, potrebbe essere migliore per visualizzare fatti invece di stime, come:

  • 5 su 10 file sono stati copiati
  • 10 di 200 MB sono stati copiati

o visualizzare fatti e una stima e chiarire che si tratta solo di una stima. Ma non mostrerei solo una stima.

Ogni utente sa che gli ETC sono spesso completamente privi di significato e quindi è difficile distinguere tra ETC significativi e ETC senza senso, specialmente per utenti inesperti.

+0

Sì, qualunque sia il metodo che uso, mostrerò sicuramente anche i progressi nelle figure grezze. –

3

Ci sono due cose da considerare qui:

  • la stima esatta
  • come presentare all'utente

1. Sulla stima

Altro che le statistiche approccio, un modo semplice per avere una buona stima della velocità corrente mentre si cancella un po 'di rumore o picchi è prendere un wei approccio ghted.

Hai già sperimentato con la finestra scorrevole, l'idea qui è di prendere una finestra scorrevole abbastanza grande, ma invece di una media semplice, dando più peso alle misure più recenti, poiché sono più indicative dell'evoluzione (un po ' come un derivato).

Esempio: Supponiamo di avere 10 finestre precedenti (x0 più recente, x9 meno recente), allora si potrebbe calcolare la velocità:

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

Quando si dispone di una buona valutazione della velocità probabile, allora siete vicino per ottenere un tempo stimato buono.

2. Nella presentazione

La cosa più importante da ricordare è che si desidera un'esperienza utente piacevole, e non un fronte scientifico.

Gli studi hanno dimostrato che gli utenti hanno reagito molto male al rallentamento e molto positivamente all'accelerazione. Pertanto, una buona barra di progresso/tempo stimato dovrebbe essere prudente nelle stime presentate (riservando il tempo per un potenziale rallentamento) all'inizio.

Un modo semplice per ottenere che è quello di avere un fattore che è una percentuale del completamento, che si utilizza per modificare il tempo rimanente stimato. Ad esempio:

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

Dove factor è tale che factor([0..1]) = [0..1], factor(x) <= x e factor(1) = 1. Ad esempio, la funzione cubica produce la piacevole accelerazione verso il tempo di completamento. Altre funzioni potrebbero utilizzare una forma esponenziale 1 - e^x, ecc ...

+0

Altre idee interessanti qui a cui non avrei pensato. –