[파이썬] shutil 파일 및 디렉토리 복사의 속도 향상 전략

파일이나 디렉토리를 복사하는 것은 프로그래밍에서 매우 일반적인 작업입니다. Python에서는 shutil 모듈을 사용하여 파일 및 디렉토리를 복사할 수 있습니다. 그러나 대량의 파일이나 큰 디렉토리를 복사할 때는 속도 문제가 발생할 수 있습니다. 이러한 상황에서 복사 속도를 향상시키는 몇 가지 전략을 살펴보겠습니다.

1. 한 번에 복사

Python의 shutil 모듈은 copytreecopy 함수를 제공합니다. copytree 함수는 디렉토리를 복사하고 copy 함수는 파일을 복사합니다.

import shutil

# 전체 디렉토리 복사
shutil.copytree(src, dst)

# 파일 복사
shutil.copy(src, dst)

이러한 함수들은 파일 또는 디렉토리를 한 번에 한 개씩 복사하기 때문에 대량의 파일을 처리할 때는 성능 상의 문제가 발생할 수 있습니다.

2. 병렬 처리

Python의 concurrent.futures 모듈을 사용하여 병렬 처리를 할 수 있습니다. 파이썬 3.2 이상의 버전에서는 이 모듈을 사용할 수 있습니다.

import shutil
import concurrent.futures

def copy_file(src, dst):
    shutil.copy(src, dst)

with concurrent.futures.ThreadPoolExecutor() as executor:
    futures = [executor.submit(copy_file, src_file, dst_file) for src_file, dst_file in file_pairs]

concurrent.futures.wait(futures)

위의 예시에서는 ThreadPoolExecutor를 사용하여 병렬로 파일을 복사합니다. submit 함수를 사용하여 병렬로 실행될 작업을 제출한 다음, wait 함수를 사용하여 작업이 모두 완료될 때까지 대기합니다.

3. 파일 스트림 복사

shutil 모듈의 copyfileobj 함수를 사용하여 파일을 스트림 형태로 복사할 수 있습니다. 이를 사용하면 파일을 한 번에 한 조각씩 읽고 쓰는 대신 작은 블록 단위로 복사할 수 있습니다.

import shutil

block_size = 1024 * 1024  # 1MB

with open(src, 'rb') as src_file:
    with open(dst, 'wb') as dst_file:
        shutil.copyfileobj(src_file, dst_file, block_size)

위의 예시에서 block_size 변수는 한 번에 복사될 데이터 블록의 크기를 나타냅니다. 더 큰 블록 크기는 더 빠른 복사 속도를 가져올 수 있지만, 시스템 메모리에 의해 제한될 수도 있습니다.

4. OS 기능 사용

Python의 shutil 모듈은 파일 및 디렉토리를 복사하는 기능을 제공하지만, 내부적으로는 운영 체제의 기능을 사용합니다. 따라서 직접 운영 체제의 기능을 사용하는 것이 더 빠를 수 있습니다. 예를 들어, subprocess 모듈을 사용하여 운영 체제의 cp 명령을 호출하면 속도가 더 빠를 수 있습니다. 하지만 이 방법은 운영 체제에 종속적이므로 주의해야 합니다.

import subprocess

subprocess.run(['cp', '-r', src, dst])

위의 예시에서 -r 플래그는 디렉토리를 재귀적으로 복사하도록 합니다. 필요에 따라 명령어를 조정할 수 있습니다.

결론

Python의 shutil 모듈을 사용하여 파일 및 디렉토리를 복사할 때 속도를 향상시키는 다양한 전략을 살펴보았습니다. 복사할 파일의 크기나 개수에 따라 가장 효율적인 방법을 선택할 수 있습니다.