PDA

View Full Version : [java] download segmentato


afsdfdlecosdfsfdcco
24-12-2007, 14:37
Ho realizzato un piccolo download manager ( http://www.macupdate.com/info.php/id/26584/jet-it%21 ) ed ora vorrei migliorarlo un po'. In particolare vorrei aggiungere il download segmentato in modo da "accelerare" un po' il download. Come posso implementare una cosa del genere? Esistono gia' librerie per fare qualcosa del genere?

Grazie :)

cionci
24-12-2007, 15:20
Cioè un download diviso in più parti ?
Per farlo ti basta sfruttare lo stesso algoritmo che usi per il resume...solamente che chiedi al server un parte (ad esempio "6000000-8000000", invece di "6000000-").
Ovviamente dovrai tenerti consistente una specie di "mappa" che ti dice le parti del file mancanti.

afsdfdlecosdfsfdcco
24-12-2007, 15:29
Cioè un download diviso in più parti ?
Per farlo ti basta sfruttare lo stesso algoritmo che usi per il resume...solamente che chiedi al server un parte (ad esempio "6000000-8000000", invece di "6000000-").
Ovviamente dovrai tenerti consistente una specie di "mappa" che ti dice le parti del file mancanti.


Come faccio a chiederne solo una parte? Devo controllare manualmente di continuo come sta procedento o c'e' gia' una procedura automatizzata? Ogni pezzo del download sara' scaricato in un file a parte, giusto? Come posso rimettere insieme i pezzi senza danneggiare il file?

Al momento ogni download gira in parallelo. Col download segmentato ogni thread genererà altri thread... Quanti download potro' far andare in contemporanea senza avere un'esplosione di thread?

Grazie (anche per come mi avete aiutato in precedenza) :)


edit: ora la richiesta è cosi':

connection.setRequestProperty("Range", "bytes=" + totalDownloaded + "-");

Basta modificarla in

connection.setRequestProperty("Range", "bytes=" + pezzo1 + "-" + pezzo2);

?

cionci
24-12-2007, 15:37
Ogni pezzo del download sara' scaricato in un file a parte, giusto? Come posso rimettere insieme i pezzi senza danneggiare il file?

Il modo più semplice è quello di creare al momento in cui andrai ad iniziare il download un file grande quanto dovrà essere il file finale e riempito di zero.
Andrai a scrivere ogni parte del file contemporaneamente al rispettivo offset andando a sovrascrivere gli zero.
Al momento ogni download gira in parallelo. Col download segmentato ogni thread genererà altri thread... Quanti download potro' far andare in contemporanea senza avere un'esplosione di thread?

Chiaramente devi imporre dei parametri di configurazione. Max 10 thread per file e max 3-4 file contemporanei.
edit: ora la richiesta è cosi':

connection.setRequestProperty("Range", "bytes=" + totalDownloaded + "-");

Basta modificarla in

connection.setRequestProperty("Range", "bytes=" + pezzo1 + "-" + pezzo2);

?
Indicativamente sì, ma chiaramente devi fare qualche prova ;)

afsdfdlecosdfsfdcco
24-12-2007, 17:39
Il modo più semplice è quello di creare al momento in cui andrai ad iniziare il download un file grande quanto dovrà essere il file finale e riempito di zero.
Andrai a scrivere ogni parte del file contemporaneamente al rispettivo offset andando a sovrascrivere gli zero.

mmm, si, non sembra difficile... Ma non ci sono problemi se accedo in scrittura sullo stesso file piu' volte contemporaneamente?


Chiaramente devi imporre dei parametri di configurazione. Max 10 thread per file e max 3-4 file contemporanei.

Ok


Indicativamente sì, ma chiaramente devi fare qualche prova ;)

Mi aspetta una lunga nottata :D

cionci
24-12-2007, 17:50
mmm, si, non sembra difficile... Ma non ci sono problemi se accedo in scrittura sullo stesso file piu' volte contemporaneamente?

In teoria dovrebbe venire aperto in modalità shared...comunque basta provare ;)
Al limite ti fai una classe condivisa che ha il compito di salvare su file i dati nella posizione che specifichi come parametro (così il file lo tiene aperto solo quella classe).

afsdfdlecosdfsfdcco
24-12-2007, 18:26
In teoria dovrebbe venire aperto in modalità shared...comunque basta provare ;)
Al limite ti fai una classe condivisa che ha il compito di salvare su file i dati nella posizione che specifichi come parametro (così il file lo tiene aperto solo quella classe).

Grazie, provero' a fare qualcosa del genere :)