지난번에 작성했던 ubuntu서버와의 코드 동기화처럼 스토리지도 코드를 간편하게 동기화하고자 작성하게 되었다.
기능 목차
1. 동기화를 위해 로컬 및 스토리지의 파일들의 리스트를 가져오는 기능
2. 중점을 맞춘 파일 리스트를 기준으로 필터링
3. 업로드, 다운로드 및 파일 삭제
4. 프로그레스바 출력
사용자 입력
1. 중점(focus): 스토리지 혹은 로컬을 지정 가능하며, 지정한 것을 기준으로 파일을 동기화
2. 목표(target): 동기화할 폴더 혹은 파일을 지정, 해당 파일 혹은 폴더를 동기화
3. 덮어쓰기(overwrite): True, False에서 지정 가능하며, True일 경우 삭제되지 않는 파일의 경우 덮어 씌움
로컬 및 스토리지 파일리스트 가져오기
1. 로컬 파일리스트 가져오기
미리 지정된 기본 경로에서 입력으로 받은 경로(target)의 하위 파일들의 목록 가져오는 python 코드
파일들의 경로를 가져올 때, 전체 경로를 가져오지 않고 기본 경로를 제외한 경로를 가져오고 있다.
만약 입력받은 경로(target)가 파일일 경우 그대로 반환한다.
2. 스토리지 파일리스트 가져오기
스토리지에서 파일들의 리스트를 가져오는 python 코드
로컬과 마찬가지로 기본 경로가 있으며 입력으로 받은 경로의 하위 파일들의 목록 가져온다.
중점(focus)을 맞춘 파일 리스트를 기준으로 필터링
입력으로 받은 중점(focus)을 바탕으로 파일리스트를 필터링한다.
만약
- 로컬에 중점을 주었다면, 로컬에 없는 파일이 있다면 업로드, 있다면 삭제를 진행한다.
- 스토리지에 중점을 주었다면, 스토리지에 없는 파일이 있다면 다운로드, 있다면 삭제를 진행한다.
업로드, 다운로드 및 파일 삭제
업로드 및 다운로드 리스트(add_list), 삭제 리스트(del_list)를 바탕으로 진행된다.
중점에 따라서 경우의 수가 2가지로 로컬 기준, 스토리지 기준 두 가지 경우에 따라서 함수가 호출된다.
호출되는 함수의 종류는 4가지로 각각 로컬 삭제, 스토리지 삭제, 스토리지 업로드, 스토리지 다운로드 함수가 존재한다.
로컬이 중점이라면 먼저 스토리지를 삭제하는 함수를 호출 후, 업로드하는 함수를 호출한다.
스토리지가 중점이라면 먼저 로컬을 삭제하는 함수를 호출 후, 다운로드하는 함수를 호출한다.
프로그레스 바 출력
진행상황을 보기 좋게 출력하기 위해 프로그레스 바를 출력하기로 하였다.
모듈을 tqdm모듈을 사용하였고 업로드, 다운로드, 삭제 시 출력되도록 작성했다.
발견한 문제점
1. 파일 변경에 관한 문제
파일이 변경되었을 때, 변경사항이 적용이 되지 않는 문제 발견했다.
파일이 이미 존재하므로 해당 파일을 덮어쓰기 옵션을 주지 않는 이상 파일이 변경사항을 반영하지 않고 있다.
개선이 가능한 부분
1. 파일 변경에 관한 문제
hash값을 이용하여 파일 변경을 감지하는 방법으로 진행할 예정이다.
프로그램이 실행될 때 스토리지, 로컬 각각 파일들의 hash값을 저장하고 있는 파일을 생성한 후
다음 실행 시 해당 파일을 참조하여 변경을 감지할 예정이다.
2. 성능 측면(속도)
현재 코드는 파일 입출력, api호출을 동기적으로 실행하여서 실행 속도가 느리다.
IO 작업을 위해 Thread 혹은 multiprocessing을 하여 속도를 높일 수 있어 보인다.
사용 화면
약 20개의 파일, 실행시간 8초
전체 코드
https://github.com/mannamman/namthplaygroundblog/tree/main/project/local_to_gcp_storage_v1
'프로젝트 > 구글스토리지동기화' 카테고리의 다른 글
[python] GCP Storage저장소와 파일 동기화 <3> (0) | 2022.09.13 |
---|---|
[python] GCP Storage저장소와 파일 동기화 <2> (0) | 2022.09.13 |