2009-12-10 9 views
14

Ci siamo tutti divertiti alla finestra di dialogo "X minuti rimanenti" che sembra essere troppo semplicistica, ma come possiamo migliorarla?Stima/previsione download tempo di completamento

In effetti, l'input è l'insieme di velocità di download fino all'ora corrente, e dobbiamo utilizzarlo per stimare il tempo di completamento, forse con un'indicazione di certezza, come "20 -25 minuti rimanenti" usando un po 'di Y % intervallo di confidenza.

Codice che poteva essere inserito in una piccola libreria e utilizzato in progetti dappertutto, quindi è davvero così difficile? Come lo faresti? Quale ponderazione daresti alle precedenti velocità di download?

Oppure esiste già un codice open source?

Edit: Riassumendo:

  1. migliorare il tempo di completamento stimato tramite una migliore algo/filtro ecc
  2. Fornire intervallo, invece di un'unica tempo ('1h45-2h30 minuti'), o semplicemente limitare la precisione ('circa 2 ore').
  3. Indica quando il progresso è in stallo, anche se se il progresso si ferma costantemente e poi continua, dovremmo essere in grado di gestirlo. Forse 'circa 2 ore, attualmente in fase di stallo'
+4

obbligatoria riferimento xkcd: http://www.xkcd.com/612/ – jason

+0

duplicato di http://stackoverflow.com/questions/933242/smart-progress-bar-eta-computation –

risposta

4

Non confondere gli utenti fornendo più informazioni di cui hanno bisogno. Sto pensando all'intervallo di fiducia. Salta.

I tempi di download di Internet sono molto variabili. Il microonde interferisce con il WiFi. L'utilizzo varia in base all'ora del giorno, al giorno della settimana, alle festività e ai nuovi giochi entusiasmanti. Il server potrebbe essere pesantemente caricato in questo momento. Se porti il ​​tuo laptop al bar, i risultati saranno diversi rispetto a quelli di casa. Quindi, probabilmente non puoi fare affidamento sui dati storici per prevedere il futuro delle velocità di download.

Se non è possibile stimare con precisione il tempo rimanente, quindi non mentire all'utente offrendo tale stima.

Se si conosce la quantità di dati da scaricare, è possibile fornire% completamento completato.

Se non si conosce affatto, fornire un "heartbeat" - una parte dell'interfaccia utente mobile che mostra all'utente che le cose stanno funzionando, anche se non si sa quanto tempo rimane.

+1

A non-instant-ma -qualvolta la misurazione della velocità (ultimi 5 secondi?) è abbastanza utile per capire se sta andando bene. Dico non immediatamente perché mi è capitato più di una volta di vedere le velocità di download stimate nell'intervallo di Tera/Petabyte al secondo :) – Agos

+0

Lo scopo della cosa è in gran parte quello di * migliorare * le informazioni fornite all'utente. Quindi, non dicendo la bugia che la stima è accurata con una precisione eccessiva ("24 minuti 4.2 secondi rimanenti"), non dicendo che non varierà dando un singolo valore invece di un intervallo, ecc. Certamente se lo stimatore trova il input troppo variabili può indicare quello invece. –

0

Ho considerato questo e così via, me stesso. La risposta inizia con l'essere prudenti quando si calcola la velocità di trasferimento corrente (e quindi futura) e si fa la media su periodi più lunghi per ottenere stime più stabili. Forse passa basso filtrando il tempo che viene visualizzato, in modo che non si salti tra 2 minuti e 2 giorni.

Non credo che un intervallo di confidenza sarà utile. La maggior parte delle persone non sarebbe in grado di interpretarlo e mostrerebbe solo più cose che è un'ipotesi.

+0

Penso che una semplice indicazione di sicurezza funzionerebbe, come "20-25 minuti". Per lo meno varrebbe la pena limitare la precisione del valore fornito - "circa 2 ore" anziché "2 ore 16 minuti". –

8

Mi chiedo, una tecnica di stima dello stato produce buoni risultati qui? Qualcosa come un filtro Kalman?

Fondamentalmente si predice il futuro osservando il modello corrente e si modifica il modello in ogni fase temporale per riflettere le modifiche apportate al mondo reale. Penso che questo tipo di tecnica sia utilizzata per stimare il tempo rimasto sulla batteria del tuo laptop, che può anche variare in base all'uso, all'età della batteria, ecc.

vedere http://en.wikipedia.org/wiki/Kalman_filter per una descrizione più approfondita dell'algoritmo.

Il filtro dà anche una misura di varianza, che potrebbero essere utilizzati per indicare la vostra fiducia della stima (allthough, come è stato detto da altre risposte, potrebbe non essere la migliore idea di mostrare questo per l'utente finale)

Qualcuno sa se questo è effettivamente utilizzato da qualche parte per la stima del download (o della copia del file)?

+0

Kalman richiede di fornire un modello, non ne crea uno. Usa solo il modello che gli dai, e misure rumorose, per cercare di capire lo stato corrente (nascosto). –

+0

Ovviamente è necessario un modello, è possibile iniziare da uno semplice in cui si presuppone che il tasso di download sia costante e il filtro adatta il valore della velocità di download in base alle prove. – Yair

12

Più in generale, penso che si stia cercando un modo per fornire una misura istantanea della velocità di trasferimento, che è generalmente ottenuta in media su un breve periodo.

Il problema è generalmente che per essere reattivi, il periodo è in genere estremamente piccolo, il che porta all'effetto yoyo.

Vorrei proporre uno schema molto semplice, modelliamolo.

Pensare a una velocità della curva (y) nel tempo (x).

  1. la Velocità istantanea, non è altro che leggere y per la corrente x (x0).

  2. la velocità media, non è altro che Integral(f(x), x in [x0-T,x0])/T

  3. lo schema che propongo è quello di applicare un filtro, per dare più peso agli ultimi momenti, pur tenendo conto dei momenti passati.

Si può implementare facilmente come g(x,x0,T) = 2 * (x - x0) + 2T che è un semplice triangolo superficie T.

E ora si può calcolare Integral(f(x)*g(x,x0,T), x in [x0-T,x0])/T, che dovrebbe funzionare, perché entrambe le funzioni sono sempre positivi.

Ovviamente si potrebbe avere un diverso g purché sia ​​sempre positivo nell'intervallo specificato e che il suo integrale nell'intervallo sia T (in modo che la sua stessa media sia esattamente 1).

Il vantaggio di questo metodo è che, poiché si dà più peso agli eventi immediati, è possibile rimanere abbastanza reattivi anche se si considerano intervalli di tempo più ampi (in modo che la media sia più precisa e meno suscettibile di singhiozzo).

Inoltre, quello che ho visto raramente a meno di pensare avrebbe fornito stime più precise sarebbe quello di correlare il tempo utilizzato per il calcolo della media per il tempo residuo stimato:

  • se scarico un file 5KO, sta andando per essere caricato in un istante, non è necessario stimare
  • se scarico un file di 15 Mo, ci vorranno tra 2 minuti circa, quindi mi piacerebbe che le stime dicessero ... ogni 5 secondi?
  • se scarico un file 1.5 Go, ci vorranno ... circa 200 minuti (con la stessa velocità) ...vale a dire 3h20m ... forse che una stima ogni minuto sarebbe sufficiente?

Quindi, più lungo sarà il download, meno reattivo è necessario essere e più posso calcolare la media. In generale, direi che una finestra potrebbe coprire il 2% del tempo totale (forse tranne le poche prime stime, perché la gente apprezza il feedback immediato). Inoltre, è sufficiente indicare l'avanzamento per% intero alla volta. Se il compito è lungo, ero disposto ad aspettare comunque.

+3

Eccellente, ma l'integrale è probabilmente sovrastampato. Chiamiamolo media pesata di alcuni campioni recenti. :-) –

+4

@Konrad: vero, era per il rigore matematico e le implementazioni reali sono incoraggiate ad approssimarlo ^^ –

2

Migliorare il tempo stimato in sé: Intuitivamente, direi che la velocità della connessione di rete è una serie di valori casuali attorno ad una certa velocità media temporanea: le cose scorrono ad una velocità, poi improvvisamente rallentano o accelerano.

Un'opzione, quindi, potrebbe essere quella di pesare il set precedente di velocità di qualche esponenziale, in modo che i valori più recenti ottengano la ponderazione più forte. In questo modo, poiché la velocità media precedente si sposta ulteriormente nel passato, il suo effetto sulla media corrente si riduce.

Tuttavia, se la velocità varia in modo casuale, potrebbe valere la pena di appiattire la parte superiore dell'esponenziale (ad esempio utilizzando Gaussian filter), per evitare un'eccessiva fluttuazione.

Quindi, in sintesi, sto pensando di misurare la deviazione standard (forse limitata agli ultimi N minuti) e di utilizzarla per generare un filtro gaussiano che viene applicato agli input e quindi limitare la precisione quotata utilizzando lo standard deviazione.

Come, tuttavia, si limiterà il calcolo della deviazione standard agli ultimi N minuti? Come sai quanto tempo impiegare?

In alternativa, esistono possibilità di riconoscimento del modello per rilevare se abbiamo raggiunto una velocità stabile.