:: python

python :: 파이썬 파일 복사 shutil.copy 속도 빠르게 향상시키기

토람이 2021. 6. 17. 20:53

파이썬에서 파일을 복사할 때 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