2014-10-01 5 views
0

현재 800,000 개 이상의 URL에서 파일을 다운로드하려고합니다. 각 URL은 .txt 파일을 나타냅니다.이파이썬을 사용하여 파일을 빠르게 다운로드하십시오.

index  Filename           
4   .../data/1000015/0001104659-05-006777.txt 
5   .../data/1000015/0000950123-05-003812.txt 
...... 

코드 : 그러나, 속도가 매우 낮은

for i in m.index: 
    download = 'ftp:/.../' + m['Filename'][i] 
    print download 
    urllib.urlretrieve(download, '%s''%s.txt' % (m['Co_name'][i], m['Date'][i])) 
이 방법은 작동

입니다 나는 모든

URL 정보를 저장하는 dataframe을 사용하고

, 그것은 7 분 안에 15 개의 파일을 다운로드합니다. 내가 800,000 개 이상의 파일을 가지고 있다고 생각해. 그것은 9 개월 이상입니다 ... 그래서 누군가가 내가 이것을 향상 시키는데 도움이 될지 궁금해하고 있었습니까? 정말 고맙습니다.


정말 도움이되는 몇 가지 의견을 남기고 몇 가지 사항을 변경했습니다. 다음은 멀티 프로세싱을 수행하는 좋은 방법입니까?

코드 :

def download(file): 
    import ftplib 
    ftp = ftplib.FTP('XXXX') 
    ftp.login() 
    for i in m.index: 
    a = m['Filename'][i] 
    local_file = os.path.join("local_folder", '%s %s.txt' % (m['Co_name'][i], m['Data'][i])) 
    fhandle = open(local_file,'wb') 
    print fhandle 
    ftp.retrbinary('RETR '+a, fhandle.write) 
    fhandle.close() 

m=pd.read_csv('XXXX.csv', delimiter=',', index_col='index') 

pool = Pool(10) 
pool.map(download, m) 
+1

다중 스레드 사용 – laike9m

+0

파일의 평균 크기는 얼마입니까? – kums

+0

@kums, 평균은 100kb입니다. – Brad

답변

1

이렇게하면 모든 파일에 대한 새 연결을 설정합니다. 즉, 아무것도 다운로드되지 않은 모든 파일에 대해 몇 초의 시간이 손실됩니다.

ftplib (https://docs.python.org/2/library/ftplib.html)을 사용하면이 연결을 통해 단일 연결을 설정하고 하나씩 파일을 검색 할 수 있습니다.

아직 데이터가 전송되지 않는 시간이 있습니다. 최대 대역폭을 사용하려면 스레드를 사용하여 여러 파일을 동시에 다운로드하십시오. 그러나 일부 서버는 병렬 연결 수를 제한합니다.

그러나 시간 오버 헤드는 몇 초를 초과해서는 안되며, 최악의 경우 5 시간이 걸릴 수 있습니다. 그러면 100kB 파일의 경우 약 25 초가 매우 느립니다. 연결 속도가 너무 느리거나 서버가 정상적으로 작동하는 것 같습니다. FTP가 표준 방법이 아닌 경우, 연결이 종료되면 메인 프레임의 FTP 서버가 종료되고 연결이 설정되면 시작할 수 있습니까? 그런 다음 FTPlib가 도움이됩니다. 여전히 0.5 초의 오버 헤드는 400.000 초의 대기를 의미합니다. 따라서 병렬로 다운로드하는 것이 좋습니다.

먼저, filezilla와 같은 FTP 클라이언트를 시도해보고 가능한 대역폭을 확인하십시오.

+0

고마워요, 빠릅니다. 언급했듯이 실제로 여러 스레드를 사용해야합니다. – Brad

+0

안녕하세요, @sweber. 내 코드를 업데이트했습니다. 시간을 줄이는 것이 유효한 방법이라고 생각하십니까? – Brad

+0

안녕하세요! 그것은 작동해야합니다. 왜 그냥 시험하지 그래? 마찬가지로 서버가 병렬로 10 개의 파일을 다운로드 할 수 있는지 확인하십시오.그리고 10 개의 연결을 한 번 열어서 모든 파일을 다운로드하는 것이 더 좋습니다. 코드가 더 많아서 그만한 가치가 있는지 확인해야합니다. – sweber

관련 문제