Baixando um mesmo arquivo em mais de um computador

Bom galera, resolvi escrever esse artigo pois percebi que muitas vezes temos limite de banda muito baixo, e surgiu um modo de fazer uma união de computadores para baixar um arquivo (geralmente muito grande) em mais de 1 PC, diminuindo proporcionalmente o tempo de download, conforme a quantidade de PCs envolvidos.

[ Hits: 15.311 ]

Por: Jakson de Oliveira Lima em 28/02/2011


Introdução



Olá, imagine baixar um arquivo de 2GB em uma conexão de 128k? Demora muito não é??!!! Seria mais de um dia!!! E se você se unisse com alguns amigos, vizinhos etc para baixar esse mesmo arquivo? Só que cada um em seu PC? E muitas vezes usando conexões diferentes?! E agora, como conciliar isso?

Foi o que pensei por muito tempo até achar uma solução que funcionasse. Primeiro a ideia foi fácil, basta cada computador baixar uma parte do arquivo e depois juntar as partes em 1 PC. Os próprios gerenciadores de download dividem o arquivo baixando-os em partes, só que eles não permitem selecionar qual parte vamos baixar, então não poderíamos usá-los pois todos eles baixariam o arquivo de forma independente.

Foi preciso usar um programa capaz de baixar especificamente uma parte do arquivo, pois cada computador vai baixar um parte independente, e esse programa foi o versátil curl do Linux, com ele podemos especificar cada byte que queremos baixar, através de uma range.

Depois disso iremos dividir o trabalho, selecionando qual computador baixará qual parte, e por último pegar as partes através de CDs, pendrives etc e uní-los em um computador.

Vamos ao trabalho!

Primeiro precisamos do curl instalado, no LINUx isso é fácil, no WINDows também (sim ele funciona muito bem no Windows, alias testei primeiro no Windows).

Se sua distro for baseada em Debian, instale o curl pelo comando abaixo:

# apt-get install curl

No Windows vai precisar baixar o binário para executar via CMD:
Extraia o arquivo, vá na pasta bin, lá tem o executável curl.exe com todas as bibliotecas necessárias.

Escolha o arquivo, no meu exemplo usarei a ISO do Slackware 13.1, uma criancinha de pequenos 4GB, imagina isso a uma conexão de 128k, é triste só em pensar... seriam 3 dias, 2 hrs, 33 mins, 55 segs, isso com disponibilidade o tempo todo.

Link: http://slackware.mirrors.tds.net/pub/slackware/slackware-13.1-iso/slackware-13.1-install-dvd.iso

Se quiser uma boa calculadora de tempo de download veja nesse link: http://www.cabangu.com.br/novo/paginas/sdnet/time_calc/

Vamos por a mão na massa, primeiro precisamos saber quanto vai baixar cada PC, e essa medida tem que ser em bytes. Para isso criei uma pequena planilha para automatizar, pois não sei nada de script ou programação. Disponibilizei ela online pelo link abaixo:
Primeiro veja que qualquer um pode alterar a planilha, com isso vocês podem melhorá-la. Para usá-la basta colar o link no campo link, em tamanho coloque o tamanho em MB, no nosso caso 4096, em "Nome com ext." coloque o nome do arquivo com extensão conforme o modelo "slackware-13.1-install-dvd.iso". Depois coloque quantos computadores vão baixar o arquivo em "Q. PC's".

Ela irá calcular a quantidade de bytes que serão baixados por cada PC, como pode se perceber nessa planilha só gera comandos para no máximo 5 PCs, mas isso pode ser simplesmente aumentado para quantos quiser uma outra hora.

Pode ver que ele vai gerar o comando pronto com a range de cada parte, bastando apenas colar no terminal ou no CMD em caso do Windows (lembrando que no caso do Windows vai ter que ser na pasta bin do arquivo baixado). Explicarei abaixo o comando, embora a planilha já gere ele pronto.

Exemplo:

# curl -o slackware-13.1-install-dvd.iso.1 -r0-858993450 http://slackware.mirrors.tds.net/pub/slackware/slackware-13.1-iso/slackware-13.1-install-dvd.iso

Onde "slackware-13.1-install-dvd.iso.1" pode ser alterado para o nome que desejar, o "-r0-858993450" quer dizer que ele vai baixar os primeiros 858993450 bytes do arquivo, e no final do comando o link do arquivo. Um comando bem simples.

Para a segunda parte foi só começar pelo byte posterior até o final da parte. Veja exemplo do segundo comando para a máquina 2:

# curl -o slackware-13.1-install-dvd.iso.2 -r858993451-1717986900 http://slackware.mirrors.tds.net/pub/slackware/slackware-13.1-iso/slackware-13.1-install-dvd.iso

Aí é só seguir o ritmo e colando o próximo comando em outra máquina, perceba que na última parte coloquei um número muito grande para que não fique jamais faltando um fragmento do arquivo, pois como muitas vezes não sabemos o tamanho em bytes do download, poderia acabar ficando um resto na divisão por PCs e o download sairia corrompido. Assim executando cada comando em um PC irá baixar uma parte diferente do mesmo arquivo, em uma noite 5 computadores por exemplo baixam 1 mesmo arquivo, porém de forma conjunta, pois cada um baixa uma parte diferente que só vai servir quando unir todas.

Depois de horas de download (pelo menos não serão dias, hehe), quando terminar é só juntar os arquivos em um PC, levando as partes de um computador pro outro através de pendrives, CDs, DVDs etc. Quando tiver todas as partes reunidas numa pasta, poderá uní-las pelos métodos a seguir:

atribuir extensões .001, .002, .003 e juntar com o HJ-Split, ou usar comandos nativos dos sistemas (prefiro assim).

No Windows poderá unir com o comando "type". Suponha que as partes sejam slackware-13.1-install-dvd.iso.1, slackware-13.1-install-dvd.iso.2,slackware-13.1-install-dvd.iso.3 etc. Como varia somente o final, no CMD com todos as partes na mesma pasta basta usar o comando abaixo:

type slackware-13.1-install-dvd.iso.* > slackware-13.1-install-dvd.iso

Aí seria gerado o arquivo completo slackware-13.1-install-dvd.iso.

No Linux é quase a mesma coisa, mas o comando é o cat. No caso seria:

# cat slackware-13.1-install-dvd.iso.* > slackware-13.1-install-dvd.iso

Pronto, você juntou todas as partes baixadas em PCs diferentes.

Como percebeu, supondo que cada um dos 5 PCs que baixaram as partes tivessem uma conexão de 125k, demoraria 14 hrs, 54 mins, 47 segs para cada parte, mas como todas podem ser baixadas simultaneamente, teríamos somente 14 hrs, 54 mins, 47 segs para baixar todo o arquivo, contra 3 dias, 2 hrs, 33 mins, 55 segs de uma máquina solitária, ou seja, 5x mais rápido, isso quer dizer que quanto mais máquinas envolvidas mais rápido será.

Agora vamos ver como fazer isso quando possível em somente uma máquina e alguma considerações finais.

    Próxima página

Páginas do artigo
   1. Introdução
   2. Usando apenas uma máquina e considerações finais
Outros artigos deste autor
Nenhum artigo encontrado.
Leitura recomendada

Redes, Modelos de Referência, suas Camadas e seus Protocolos

Simulando aplicações simples com TinyOS e Cooja

Balanceamento de carga e alta disponibilidade com Bonding Driver e Iproute2

Integrando Apache 2 com Tomcat 5

Solução completa para Web Server usando Apache + SSL + MOD_JK + PHP + MySQL

  
Comentários
[1] Comentário enviado por albfneto em 28/02/2011 - 18:10h

é uma boa ideía. Original e diferente.
eu uso Curl. Curl, Axel e Prozilla.

[2] Comentário enviado por alefesampaio em 28/02/2011 - 22:49h

Muito bom parabens pelo artigo vai ficar nos favoritos. ou seja Ctrl+D.

[3] Comentário enviado por removido em 02/03/2011 - 21:26h

Gostei bastante da idéia, parabéns! realmente criativo e original.

Abraços!

[4] Comentário enviado por luizdaniel em 02/03/2011 - 22:12h

muito bom, pra quem tem internet lenta iguai a mim, isso é mamão com açucar, quero saber se dar pra pegar um pedaço do arquivo agora e outro só amanhã?, se funciona dessa forma? , se for assim vai ser ótimo, podendo baixar 1giga em 3 ou 4 dias em arquivos pequenos que não pesão na rede, valeu mesmo!

[5] Comentário enviado por jaksonbt em 03/03/2011 - 00:04h

Pode ser luizdaniel, basta você executar o comando diferente para cada dia para que baixe a cada dia uma parte diferente, mas se for usar apenas uma máquina recomendo os gerenciados de downloads comuns que podem pausar o download e continuar depois na outra noite, o artigo só é mesmo útil para quando de usa várias máquinas (mesmo que virtuais), quando for só um PC é melhor os métodos padrões mesmo.

muito obrigado a todos que gostaram do meu artigo.

[6] Comentário enviado por c4rl em 05/03/2011 - 00:14h

Muito interssante a ideia, além de original. Uma mão na roda para aqueles que ainda dependem de conexões discadas.

Abraços.

[7] Comentário enviado por removido em 09/03/2011 - 22:19h

Para um computador e para baixar um grande arquivo somente a noite eu tenho um script que usa o famoso e incrível "wget -c".

Eu tenho 3 links de 300kbps (um no cômodo separado que faço minhas experiências, outro no quarto da minha filha e outro na sala para a cunhada e minha esposa, mas todo mundo usa lá um pouco) e costumo baixar três arquivos simultaneamente, que já é legal.
Mas estive pensando nas máquinas vistuais, pois não vou ligar três computadores como faço ao usar os 3 links sempre. Mas, posso deixar os 2 servidores da empresa que ficam sem nada pra fazer a noite, mais um pc em casa.

Mas se eu ligar os três cabos que saem dos modens adsl que tenho em um computador através de um switch, cada um com um endereço de rede diferente e depois três redes virtuais no Linux vai funcionar legal com três máquinas virtuais (como um cluster de três computadores virtuais).

Será que o wget + curl etc. não busca as partes em cada endereço de rede independentemente... Sem usar máquinas virtuais? Será que não tem um jeito de fazer isto? O jeito é pesquisar muito e fazer uns testes.

E valeu pelo seu trabalho, pois abriu muitas possibilidades...

[8] Comentário enviado por jaksonbt em 09/03/2011 - 23:09h

Tonyfrasouza, você teve uma boa ideia, pelo que percebi o CURL aceita especificar a interface mesmo veja o que achei no sitedo CURL:

--interface <name>

Perform an operation using a specified interface. You can enter interface name, IP address or host name. An example could look like:

curl --interface eth0:1 http://www.netscape.com/

If this option is used several times, the last one will be used.


Vou fazer uns testes e verificar se da certo. Seria realmente o fim da necessidade de maquinas virtuais.

[9] Comentário enviado por ramonzitos em 14/03/2011 - 16:13h

Boa dica!

[10] Comentário enviado por ramonzitos em 14/03/2011 - 16:54h

Programa web para isso:
http://klyscripts.agilityhoster.com/cdivcurl.cgi
Tem uma margem de erro de 50 MB no ultimo link. Transforma GB, MB e KB direto em Bytes.

[11] Comentário enviado por jaksonbt em 14/03/2011 - 17:28h

ramonzitos, esbarrei nesse problema da margem de erro também na hora de fazer a planilha, mas achei a solução, é só colocar sempre na ultima parte o ultimo range 999999999999900000.

Como no exemplo abaixo:

curl -o Devil.May.Cry.4.Full-Rip.Skullptura.Theevolution.org.By.Sniper1.part3.rar.5 -r75243620470121-999999999999900000 http://...


Colocando "999999999999900000" ele baixara até 931.322.574,61 gigabytes, ou até o final do arquivo, assim nunca ficara faltando uma parte!!

Issso já esta implementado na planilha, no caso do scrip basta alterar o range na hora de usar o ultimo comando. Exemplo:

Comando do PC15 (ultimo)
curl -o slackware-13.1-install-dvd.iso.15 -r4008636144-4347396096 http://slackware.mirrors.tds.net/pub/slackware/slackware-13.1-iso/slackware-13.1-install-dvd.iso

altera para:
curl -o slackware-13.1-install-dvd.iso.15 -r4008636144-999999999999900000 http://slackware.mirrors.tds.net/pub/slackware/slackware-13.1-iso/slackware-13.1-install-dvd.iso

E ele baixara todo o restante.
Gostei muito do script web e obrigado por ajudar.


[12] Comentário enviado por ramonzitos em 14/03/2011 - 19:14h

@jaksonbt: Valeu pelo toque, esta adicionado, fico feliz por ter gostado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts