[파이썬] shutil 대용량 데이터의 효율적인 압축 및 전송 전략

파이썬의 shutil 모듈은 파일 및 디렉토리 작업에 유용한 함수를 제공합니다. 이번 블로그 포스트에서는 shutil 모듈을 사용하여 대용량 데이터의 효율적인 압축 및 전송 전략을 소개하고자 합니다.

압축 전략

대용량 데이터의 압축은 디스크 공간을 절약하고, 전송 및 저장 시간을 단축시키는데 매우 중요합니다. shutil 모듈은 다양한 압축 알고리즘을 지원하며, 이 중에서 가장 널리 사용되는 ziptar 형식에 대해 알아보겠습니다.

1. zip 파일로 압축하기

다음은 shutil 모듈을 사용하여 디렉토리를 zip 파일로 압축하는 예제 코드입니다.

import shutil

def compress_to_zip(source_dir, output_zip):
    shutil.make_archive(output_zip, 'zip', source_dir)

source_dir = '/path/to/source/directory'
output_zip = '/path/to/output/archive.zip'

compress_to_zip(source_dir, output_zip)

위의 코드는 source_dir에 있는 모든 파일과 디렉토리를 output_zip으로 지정한 이름의 zip 파일로 압축합니다. make_archive 함수의 첫 번째 인자로 압축 파일의 이름을 지정하며, 두 번째 인자로 압축 형식을 지정합니다. 압축 형식은 'zip'으로 지정합니다.

2. tar 파일로 압축하기

tar 형식은 리눅스 환경에서 더 많이 사용되는 압축 형식입니다. shutil 모듈을 사용하여 디렉토리를 tar 파일로 압축하는 방법을 알아보겠습니다.

import shutil

def compress_to_tar(source_dir, output_tar):
    shutil.make_archive(output_tar, 'gztar', source_dir)

source_dir = '/path/to/source/directory'
output_tar = '/path/to/output/archive.tar.gz'

compress_to_tar(source_dir, output_tar)

위의 코드 예제는 make_archive 함수의 두 번째 인자를 'gztar'로 지정하여 tar.gz 형식으로 압축하도록 설정했습니다. 'gztar'은 타르 암호화와 gzip 압축을 결합한 형식입니다.

전송 전략

대용량 데이터를 압축한 후 전송할 때에도 몇 가지 전략을 고려할 수 있습니다. 네트워크 대역폭이 제한된 경우, 파일을 작은 조각으로 나누어 전송하는 분할 및 병렬 전송 전략을 사용할 수 있습니다. shutil 모듈을 사용하여 파일을 나누고, 병렬로 전송하는 방법을 알아보겠습니다.

1. 파일 분할하기

shutil 모듈에는 파일을 분할하기 위한 copyfileobj 함수도 제공됩니다. 다음은 파일을 작은 조각으로 분할하는 예제 코드입니다.

import os
import shutil

def split_file(input_file, output_dir, chunk_size):
    os.makedirs(output_dir, exist_ok=True)
    with open(input_file, 'rb') as file:
        chunk_number = 0
        while True:
            chunk = file.read(chunk_size)
            if not chunk:
                break
            output_file = os.path.join(output_dir, f'chunk{chunk_number}')
            with open(output_file, 'wb') as chunk_file:
                chunk_file.write(chunk)
            chunk_number += 1

input_file = '/path/to/large/file'
output_dir = '/path/to/output/directory'
chunk_size = 1024 * 1024  # 1MB

split_file(input_file, output_dir, chunk_size)

위의 코드는 input_filechunk_size로 지정된 크기의 작은 파일로 분할합니다. 분할된 작은 파일들은 output_dir에 저장됩니다.

2. 병렬로 파일 전송하기

파일을 분할한 후에는 각각의 조각 파일을 병렬로 전송할 수 있습니다. 이는 네트워크 대역폭을 효율적으로 활용하는 전략입니다. shutil 모듈은 파일을 복사하는 copyfile 함수를 제공하며, 이를 이용하여 병렬 전송을 수행할 수 있습니다.

import os
import shutil
from multiprocessing import Pool

def parallel_copy(chunk_file):
    # 파일을 전송하는 로직을 작성합니다.
    # 예를 들어, FTP 라이브러리를 사용하거나, HTTP 요청을 보내는 등의 방법을 사용할 수 있습니다.
    pass

def parallel_transfer(input_dir):
    # input_dir에 있는 모든 chunk 파일들을 병렬로 전송합니다.
    with Pool() as pool:
        pool.map(parallel_copy, os.listdir(input_dir))

input_dir = '/path/to/chunk/files'

parallel_transfer(input_dir)

위의 코드는 parallel_transfer 함수에서 input_dir에 있는 모든 조각 파일들을 병렬로 전송하는 예제입니다. multiprocessing.Pool을 사용하여 각 파일 전송을 병렬로 실행할 수 있습니다. parallel_copy 함수에는 실제로 파일 전송을 수행하는 로직이 들어가야 합니다.

마무리

shutil 모듈은 파이썬에서 대용량 데이터를 효율적으로 압축하고 전송하기 위한 다양한 기능을 제공합니다. 위에서 소개한 압축 전략과 전송 전략을 적절히 조합하여 프로젝트의 요구사항에 맞게 사용할 수 있습니다.