파이썬에서 파일을 복사할 때 shutil 라이브러리의 copy, copyfile 등의 함수를 많이 사용한다.
그런데 파일 복사 속도가 꽤 느린 편이다^.^;
shutil 라이브러리 파일에서 copy 함수들을 보면
궁극적으로 copyfileobj 함수를 호출하게 되어 있다.
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)
copyfileobj 함수는 이렇게 정의되어있다.
주목해야 할 부분은 length=16*1024
즉, 파일 전송 시 최대 buffer size가 16K
=> size가 큰 파일을 복사하면 상당히 느려진다.
이 length 부분을 수정해서 속도를 개선해보자.
파일 복사 속도 향상시키는 방법
1. shutil.py 에서 직접 copyfileobj 함수를 수정하기
: 하지만 라이브러리 파일을 건드리는 건 권장하지 않는다.
2. 나의 코드 내에 사용자 함수를 선언, copyfileobj 를 override(재정의) 하기
def _copyfileobj_patched(fsrc, fdst, length=16*1024*1024):
"""Patches shutil copyfileobj method to hugely improve copy speed"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)
shutil.copyfileobj = _copyfileobj_patched # shutil 의 copyfileobj 대신 _copyfileobj_patched 이 호출됨
요렇게 하면 최대 buffer size 16M 가 되어
size가 큰 파일도 기가 막히게 전송이 빨라진다!
300x250
':: python' 카테고리의 다른 글
python :: 파이썬 텍스트 파일 내 특정 단어 치환(replace)하기 (3) | 2021.06.23 |
---|---|
python :: 파이썬 requests 로 REST API 호출하기 (2) | 2021.06.21 |
python :: 파이썬 파일/폴더 복사 shutil copy, copy2, copyfile, copytree (2) | 2021.06.16 |
python :: 파이썬 zipfile 로 파일 압축하기(하위폴더 포함/미포함) & 압축 해제하기 (0) | 2021.06.15 |
python :: os.listdir과 os.walk (파이썬 특정 경로 내 디렉토리와 파일 검색) (0) | 2021.06.14 |