Entrar
Usuário novo? Cadastre-se
python-brasil
? Você já é um associado? Entre no Yahoo!

Dicas

Você sabia...
Você pode ordenar suas mensagens por data? Basta clicar no link da coluna data. Suas preferências serão lembradas para que você não precise fazer isso novamente sempre que retornar.

Mensagens

  Ajuda
Avançado
Função para download com baixa taxa de transferrência   Lista de tópicos   < Tópico anterior  |  Próximo tópico >
Responder < Mensagem anterior  | 
Fiz uma rotina para fazer download de arquivos na internet usando o urllib, mas
estou tendo duas dificuldades as quais não sei ainda como resolver.

A rotina está em:

http://paste.ideaslabs.com/show/XDbYw5Fh8k

onde 'human_bytes' e 'human_time' são duas funções para formatar o número de
bytes em kB, MB, ... e o tempo em hh:mm:ss. Para não perder o foco, por hora
defina-as como:

def human_bytes(s):
return '%dB' % s

def human_time(t):
return '%ds' % t

A rotina funciona muito bem, a menos dos dois problemas que encontrei:

1 - a taxa de download é 1/4 de um wget (na rede em que me encontro agora). Bom
não precisava ser uma taxa igual ou superior a do wget, mas 1/4 me surpreendeu
muito. Enquanto que esta função em python baixava a 250kB/s o wget fazia o mesmo
a 1M/s, na mesma rede, independente da ordem em que fossem executados, antes que
alguém pense que é cache.

2 - em alguns casos o download é cancelado e a função não gera erro algum, o
'try' da linha 34-66 não me retorna nada. Por este motivo tive que fazer a
checagem do tamanho baixado na linha 70.

Quanto ao problema 1, na forma que a função está definida, ela baixa uma linha
de cada vez do arquivo solicitado, que em muitos casos é um binário. Imagino que
ele deve baixar os bytes em sequência até encontrar o ascii indicando a mudança
de linha. Acho que por isto não consegue uma taxa de download boa, pois num
instante a linha baixada possui 1 byte e noutro 205, 14, 65, ... Chequei isto
imprimindo o comprimento da linha, e de fato, até onde compreendi, ocorre algo
assim.

Neste dois requisitos o wget me resolveria o problema muito bem, mas não
gostaria de ter que chamá-lo pelo Python, antes de ter certeza de que o mesmo
não pode ser feito de forma eficiente apenas com o Pyton....

Alguém tem alguma ideia de como melhorar isto?



________________________________________________________________________________\
____
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com

[As partes desta mensagem que não continham texto foram removidas]




Seg, 8 de Fev de 2010 3:13 pm

rudsonalves
Offline Offline
Enviar e-mail Enviar e-mail

< Mensagem anterior  | 
Expandir mensagens Nome/E-mail Classificar por data

Fiz uma rotina para fazer download de arquivos na internet usando o urllib, mas estou tendo duas dificuldades as quais não sei ainda como resolver. A rotina...
Rudson Alves
rudsonalves
Offline Enviar e-mail
8 de Fev de 2010
3:14 pm

... Olá, Primeira coisa que notei em seu código, você usou "file" diretamente para instânciar um objeto deste tipo, de acordo com a documentação oficial...
Allison Vollmann
allisonvoll
Offline Enviar e-mail
8 de Fev de 2010
4:28 pm

Mas fazer a "gambiarra" de usar o wget dentro do python nao dificulta uma possivel portabilidade de um *NIX para um windows ou ate um celular, por exemplo?...
@maltzsama
demetrius.al...
Offline Enviar e-mail
8 de Fev de 2010
4:48 pm

2010/2/8 @maltzsama <causbla@...> ... Não sei como resolver no caso de um celular, mas existe uma implementação do Wget pro Windows. Não tenho o link...
Henrique Baggio
hnrqbaggio
Offline Enviar e-mail
8 de Fev de 2010
4:55 pm

... Com o cygwin você consegue instalar o wget no windows e usar de boa. Mas acredito que a melhor solução seria fazer uma especie de {{{ import time while...
Rafael Sierra
sabedeusmatrix
Offline Enviar e-mail
8 de Fev de 2010
4:59 pm

Ok pessoal, mas não se trata de ser uma 'gambiarra' utilizar o wget, e o aplicativo que estou implementando, até o momento, é apenas um passatempo pessoal. ...
rudsonalves
Offline Enviar e-mail
8 de Fev de 2010
5:54 pm

Aqui: http://unxutils.sourceforge.net/ Se for algo simples, acho melhor não utilizar wget, pois criaria mais uma "dependência". A não ser que seja algum...
caio ariede
caio.ariede
Offline Enviar e-mail
8 de Fev de 2010
6:43 pm

usar wget via "system" é desnecessário. http://twistedmatrix.com/documents/8.1.0/api/twisted.web.client.html#downloadPage ... -- Ship ahoy! Hast seen the...
Alexandre Fiori
fiorix@...
Enviar e-mail
8 de Fev de 2010
10:17 pm

... Isso é relativo, pois utilizando o wget ele tem a vantagem de não ter que re-implementar todas as funcionalidades do mesmo (se for necessário), e se o...
Allison Vollmann
allisonvoll
Offline Enviar e-mail
8 de Fev de 2010
4:59 pm

2010/2/8 Rudson Alves <rudsonalves@...> ... Você tem que ler em blocos. Algo como 8K de cada vez. Caso contrário o desempenho vai ser muito ruim...
Nilton Volpato
niltonvolpato
Offline Enviar e-mail
8 de Fev de 2010
11:11 pm

Fiz alguns teste com as sugestões do Alison e os resultados são bem promissores, principalmente com blocos de 50kB. A taxa de transferência melhorou...
rudsonalves
Offline Enviar e-mail
9 de Fev de 2010
2:08 am
Avançado

Copyright © 2010 Yahoo! do Brasil Internet Ltda. Todos os direitos reservados.
Política de Privacidade - Termos do Serviço - Diretrizes - Ajuda