paramiko 질문

조회수 331회

sftp로 파일을 불러와 신구 대조를 통해 차이점을 찾고 싶습니다. 폴더안의 파일이 7만개가 넘어 한번 불러올 때마다 시간이 너무 오래 걸립니다

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host, port=port, username=username, password=password)

sftp = ssh.open_sftp()
sftp.chdir(asm)

asm_list_dir1 = sftp.listdir() # 오래 걸리는 부분
asm_list_dir1 = set(asm_list_dir1)

time.sleep(sec)

asm_list_dir2 = sftp.listdir() # 오래 걸리는 부분
asm_list_dir2 = set(asm_list_dir2)

diff = list(asm_list_dir2 - asm_list_dir1).sort()

제너레이터를 통해 시간을 줄여보려고 했습니다만 시간순으로 정렬이 안 돼 오래걸리긴 마찬가지 입니다. 제너레이터는 정렬 기능도 없는 거 같습니다

test = sftp.listdir_iter()
print(next(test))
print(next(test).filename)
>>> -rw-r--r--   1 1017     1018         1593 17 Oct 15:30 foss_asm_2210171530577273.xml
>>> foss_asm_2210171518597189.xml

글작성하는 시점(11월1일)에 불러온 파일의 생성시간은 약 2주전(10월17일)입니다.

읽기전용으로 사용하고 있고 다른 부서에서 관리하고 있어 폴더를 생성하기는 어렵습니다. 시간을 줄일 수 있는 방법이 있을까요?

걸리는 시간

start = time.process_time() # timeit.Timer()
asm_list_dir1 = set(sftp.listdir())
end = time.process_time() # timeit.Timer()
print("Time elapsed: ", end - start)  # seconds
Time elapsed:  1.09375

start = time.perf_counter() # time.process_time()
asm_list_dir2 = set(sftp.listdir())
end = time.perf_counter() # time.process_time()
print("Time elapsed: ", end - start)  # seconds
Time elapsed:  12.542309400000022
cli 접속으로 걸리는 시간은 시간 측정 어떻게 하는지 몰라서 스톱워치로 했습니다
윈도우 cmd 켜서 접속했습니다

sftp> cd (해당폴더)
sftp> ls
(생략)
foss_asm_2211012010559617.xml           foss_asm_2211012010559618.xml           foss_asm_2211012010559619.xml           
foss_asm_2211012010559620.xml           foss_asm_2211012010559621.xml           foss_asm_2211012010559622.xml           

sftp>

26초 대기 후 listing 시작
시작 12초 후 listing 종료
총 시간 38초
  • asm_list_dir1과 asm_list_dir2가 같은 것인데 굳이 2번 작업하는 이유가 뭔가요? 초보자 2022.11.1 09:00
  • 원래는 시간차를 두고 해야 하는데 테스트용으로 하다 보니 저렇게 붙여놨습니다. 사이에 time.sleep(일정시간) 이 들어가면 맞을 거 같습니다. 처음 불러온 것과 이후에 불러온 것을 비교해 새롭게 생긴 것을 찾아내서 그중에 중요한 정보만 걸러내려고 하고 있습니다. 김지용 2022.11.1 10:42
  • 한 번 호출하고 저장해두면 굳이 2번씩 호출할 필요는 없어 보입니다. 초보자 2022.11.1 12:07
  • 현재 계획은 old는 저장해 두고 new만 새로 호출해서 비교하려고 하고 있습니다. 반복문으로 바꾸면서 한번씩 호출하려고 합니다! 아직 반복문으로 안 만든 이유는 파이참 콘솔창에서 반복 시작하면 제가 개입할 수가 없고 ctrl c 눌러도 계속 작동할 때가 있어서 그렇습니다 김지용 2022.11.1 12:36
  • 제 생각에는 오래 걸리는 이유가 통신 문제인지, 단순히 파일이 많아서인지 확인해봐야할 것 같은데요. 초보자 2022.11.1 13:52
  • python 모듈을 사용하지 말고 cli 로 sftp 접속해서 listing 해보고 얼마나 걸리는지 보세요. 프로파일링을 해서 결과를 봐야 원인도 유추할 수 있습니다. 병목이 네트워크인지 7만개의 문자열을 리스트로 저장시 메모리가 부족해서 swap이 발생하는것인지...글로는 알 수가 없습니다. 정영훈 2022.11.1 17:39
  • 답변 감사드립니다. 말씀주신대로 cli접속으로 해봤는데 시간이 더 오래 걸리는 거 같습니다. 제가 한 게 맞을까요? 윈도우 cmd에서 sftp -P (포트번호) (아이디)@(주소) 입력 후 비번 입력하고 들어갔습니다. time 함수 사용하여 속도 측정한 것도 추가했는데 한번 봐주시면 감사하겠습니다. 김지용 2022.11.1 22:42
  • 성능을 결정하는 요소가 여러가지가 있습니다. 서버가 멀리 있어서 네트워크 전송이 병목인 것인지...리스팅을 할 때 조건을 줘서 적게 리스팅을 하면 빨리나오나요?...일단 나눌 수 있는 조건이 있다면 나눠서 패러럴하게 처리하는 것도 방법입니다. 정영훈 2022.11.2 00:01
  • 제너레이터로 만들면 거의 바로 값이 나오는데 네트워크 전송이 병목은 아니라고 보면 될가요? 김지용 2022.11.2 00:58
  • 작업 시간 측정해보세요. 초보자 2022.11.2 11:33
  • 대체로 1분 미만 같은데.. 저라면 그냥 참고 진행할 거 같구요, 무거운 작업을 최대한 분할 정복하는 게 중요할 듯해요. "이미 체크한 파일" 개념을 도입한다든가 특정 글자로 시작하는 파일들만 그룹별로 모아서 처리하는 식의 유사 샤딩을 도입한다든가 말이죠. 말은 쉽습니다만 엽토군 2022.11.2 11:43
  • 제너레이터로 만들 시 작업시간은 time.perf_counter()은 1초 정도, time.process_time() 은 0초로 나옵니다 김지용 2022.11.2 13:16
  • 말씀주신대로 방안을 찾아보겠습니다 김지용 2022.11.2 13:16
  • 대기시간 11초가 뭐 때문인지 알아봐야겠는데요? 통신 대기인지 작업 중 대기인지요 초보자 2022.11.2 14:15
  • 제너레이터는 의미가 없습니다. 어차피 7만개 모두 받아와야 diff를 할 수 있을테니까요. 정영훈 2022.11.2 18:47
  • 일단 원인이 뭔지 파악을 먼저 해보겠습니다. 답변주신분들 감사합니다! 김지용 2022.11.4 01:44

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)