2016-12-06 13 views
0

실제 컴퓨터의 폴더에없는 SFTP에서 데이터를 빠르게 다운로드 할 수 있는지 확인하고 싶습니다. 문제는 이러한 파일이 5 분 간격 스냅 샷이며 현재 SFTP 폴더에 수천 개가 있습니다 (말 그대로 2016 년 8 월 이후 5 분마다).SFTP에서 파일을 다운로드하는 코드 속도 향상

클라이언트에게 SFTP를 정리하고 이전 데이터를 제거 할 수 있는지 묻는 계획을 세우지 만, 그 동안에는 다운로드 코드를 개선하고 싶습니다.

기본적으로 SFTP의 각 폴더를 확인한 다음 내 컴퓨터에서 해당 폴더를 확인합니다. 파일이 존재하지 않으면 다운로드합니다 (지금 Windows 10을 사용 중입니다). 모든 파일을 나열하고 존재 여부를 확인하는 데에도 오랜 시간이 걸립니다. 폴더 중 하나만 1400 초가 걸리므로 5 분마다이 파일을 실행할 수 없습니다.

파일 이름-2016-12-06-08-55-05 - 투 - 09-00-17.csv

: 여기

with pysftp.Connection(host, username, password, port, cnopts) as sftp: 
    logger.info('Server connected') 
    for folder in folders: 
     sftp.chdir(folder) 
     logger.info('Downloading data from the {} folder'.format(folder)) 
     for file in sftp.listdir(): 
      if file not in os.listdir(os.path.join(path, folder.lower())) and sftp.isfile(file): 
       logger.info('Downloading: {}'.format(file)) 
       os.chdir(os.path.join(path, folder.lower())) 
       sftp.get(file, preserve_mtime=True) 

는 폴더 중 하나에 대한 정확한 파일 이름 구조 이 폴더 (7 개 폴더 중 하나)에 30,000 개의 파일이 있습니다 (데이터 129MB 만 해당).

+0

일관된 폴더 구조/명명 규칙이 있습니까? 찾고있는 대신 저장소 형식/명명 규칙을 기반으로 다운로드하려고 시도했다고 가정 할 수 있습니다. –

+0

폴더 구조는 정적이지만 이름은 매우 다릅니다. 파일 이름은 filename-2016-12-07-20-15-04-to-2016-12-07-20-20-09입니다. 초가 가변적 인 것 같습니다. 자, 좀 더 자세히 살펴 보겠습니다. 초를 대체하기 위해 glob 및 와일드 카드를 사용할 수 있습니다. – trench

+0

질문에 구조/명명 규칙의 예를 제공해 주시겠습니까? 그것은 누군가가 더 나은 답을 줄 수 있도록 도와줍니다. 아, 그렇습니다. 시간이 너무 길어집니다. –

답변

1

paramiko은 놀랍도록 빠른 것으로 알려져 있지 않으므로이 스크립트를 상당히 빨리 작성하는 것이 어려워 질까봐 걱정됩니다. 가능하다면, 이것은 rsync 또는 그와 비슷한 것 같아 보입니다. 원격 호스트에 rsync이 없으면 sftp를 통해 원격 파일 시스템을 마운트하고 rsync를 로컬로 실행하십시오.

내가 말한 바에 따르면, 표현식이 os.listdir(os.path.join(path, folder.lower()))은 가장 바깥 쪽 루프의 모든 반복마다 변경되지만 모든 원격 파일에 대해 평가된다는 것입니다. 따라서 매번 folder에 해당 목록을 작성한 다음 다시 사용할 수 있습니다. 그러나 나는 그것이 많은 차이를 만들 것이라고 의심합니다.

+0

listdir에서 멋진 대화. 코드를 편집 할 수 있었고 최소한 코드는 좀 더 효율적이어야합니다. 궁극적으로 클라이언트를 보관하고 데이터베이스에로드 한 후 이전 데이터를 삭제하는 정리 프로세스를 클라이언트에 설정하도록합니다. – trench