본문 바로가기
  • CobsLab upgrades your company value by AI technology
파이썬- 업무자동화

파이썬을 이용한 대용량 파일 다루기

by dmkdmk 2023. 2. 22.

대용량 파일 처리는 대량의 데이터를 다루는 경우 자주 일어나는 문제 중 하나입니다.

대용량 파일을 처리하려면 시스템 자원을 효율적으로 사용하고,

데이터를 분할하고 병렬 처리하는 방법이 필요합니다.

파이썬에서는 다양한 방법을 사용하여 대용량 파일을 처리할 수 있습니다.

파일 분할

대용량 파일을 처리할 때는 파일을 작은 조각으로 나누어 처리하는 것이 좋습니다.

이를 통해 메모리 사용량을 줄이고 파일 처리 속도를 높일 수 있습니다.

이를 위해, 파일을 나누어 처리하는 방법이 있습니다.

이를 통해 데이터를 분할하여 여러 개의 파일로 나눌 수 있습니다.

제너레이터(Generator) 함수

제너레이터 함수는 이터레이터를 생성하는 함수입니다. 대용량 파일을 처리할 때 이 함수를 사용하면 파일을 메모리에 로드하지 않고도 처리할 수 있습니다.

이를 통해 메모리 사용량을 줄이고 파일 처리 속도를 높일 수 있습니다.

멀티프로세싱

멀티프로세싱은 파이썬에서 대용량 파일 처리에 사용되는 또 다른 방법입니다.

이를 사용하면 파일을 여러 개의 프로세스에서 처리할 수 있습니다.

이를 통해 파일 처리 속도를 높일 수 있습니다.

멀티쓰레딩

멀티쓰레딩은 파이썬에서 대용량 파일 처리에 사용되는 또 다른 방법입니다.

이를 사용하면 파일을 여러 개의 쓰레드에서 처리할 수 있습니다.

이를 통해 파일 처리 속도를 높일 수 있습니다.

병렬 처리

병렬 처리는 멀티프로세싱과 멀티쓰레딩을 혼합하여 사용하는 방법입니다.

이를 통해 파일 처리 속도를 높일 수 있습니다.

파이썬을 사용하여 대용량 파일을 처리하는 방법은 다양합니다.

이러한 방법을 사용하여 파일 처리 속도를 높이고, 메모리 사용량을 줄이는 것이 중요합니다.

이를 통해 대용량 파일을 처리하는 데 있어서 빠른 속도와 높은 효율을 얻을 수 있습니다.

 

파이썬을 이용한 대용량 파일을 처리하는 방법은

딥러닝, 데이터분석, 데이터베이스 관리자 등 직무와 상관없이

꼭 한 번은 마주쳐야 하는 큰 과제 중 하나인데요,

이번 포스트에서는

파일 분할 방법에 대해 알아보겠습니다!

파일 분할은 대용량 파일 처리에서 매우 중요한 기술 중 하나입니다.

파일 분할을 통해 대용량 파일을 여러 개의 작은 파일로 나누어 처리할 수 있습니다.

이를 통해 파일 처리 속도를 높일 수 있으며, 메모리 사용량을 줄일 수도 있습니다.

파일 분할을 수행하는 방법은 매우 간단합니다.

우선, 분할할 파일을 작은 조각으로 나누어 저장하는 코드를 작성해야 합니다.

이를 위해 파일을 여러 개의 블록으로 나누어야 합니다.

이때 블록의 크기는 사용 가능한 메모리에 따라 결정됩니다.

이후, 분할된 파일을 읽어 데이터를 처리합니다.

각 분할 파일에서 데이터를 추출하고 처리하는 방법은 다양합니다.

이를 위해 제너레이터 함수나 멀티프로세싱 등을 사용할 수 있습니다.

우선 한 줄 한 줄 코드 작성을 해보겠습니다!

import os 
def split_file(input_file_path, output_directory, chunk_size): 
    if not os.path.exists(output_directory): 
        os.makedirs(output_directory)

이전 포스트에서 유용하게 쓰였던 os 라이브러리를 임포트 한 후,

split_file 함수를 정의합니다.

이 함수는 input_file_path를 입력으로 받고,

output_directory에 chunk_size 크기로 나누어진 파일을 저장합니다.

그 후,

output_directory가 존재하지 않는 경우, 이를 생성합니다.

with open(input_file_path, 'rb') as f: 
    i = 0 
    while True: 
        chunk = f.read(chunk_size) 
        if not chunk: 
            break

input_file_path를 바이너리 읽기 모드로 엽니다. 이 파일을 읽어 chunk_size 크기로 나누어 저장합니다.

파일을 chunk_size 크기로 나누어 저장합니다.

파일 끝까지 나누어진 경우, while문을 종료합니다.

output_file_path = os.path.join(output_directory, f'chunk_{i}.bin') 
            with open(output_file_path, 'wb') as output_file: 
                output_file.write(chunk) 
            i += 1

output_directory에 chunk_i.bin 파일을 생성합니다.

chunk_i.bin 파일에 나누어진 데이터를 쓰기 위해 파일을 바이너리 쓰기 모드로 엽니다. chunk_i.bin 파일에 chunk 데이터를 저장합니다.

다음 chunk_i.bin 파일을 생성하기 위해 i를 1 증가시킵니다.

따라서, split_file 함수를 호출하면 input_file_path를 chunk_size 크기로 나누어 output_directory에 저장합니다. 이를 통해 대용량 파일을 작은 파일로 분할하여 처리할 수 있습니다.

이제 전체 코드를 보고 한 번 더 리뷰 해 드리겠습니다!

import os 
def split_file(input_file_path, output_directory, chunk_size): 
    if not os.path.exists(output_directory): 
        os.makedirs(output_directory)
    with open(input_file_path, 'rb') as f: 
    i = 0 
    while True: 
        chunk = f.read(chunk_size) 
        if not chunk: 
            break
        output_file_path = os.path.join(output_directory, f'chunk_{i}.bin') 
            with open(output_file_path, 'wb') as output_file: 
                output_file.write(chunk) 
            i += 1

 

 

이 코드는 입력 파일을 작은 블록으로 나누어 output_directory에 저장합니다. 나누어진 블록의 크기는 chunk_size로 결정됩니다. 이후, 나누어진 파일들을 읽어 데이터를 처리할 수 있습니다. 이를 위해, 나누어진 파일들을 순회하며 데이터를 읽어 들이는 코드를 작성합니다.

자 분할하는 것까지 했으니, 이걸 읽어 들이는 부분도 같이 보겠습니다!

import glob 

def process_files(file_pattern): 
    for file_path in glob.glob(file_pattern): 
        with open(file_path, 'rb') as f: 
            data = f.read()

file_pattern에 매칭되는 파일들을 순회하며 데이터를 읽어 들입니다. 데이터를 처리하는 코드는 여러분의 업무 요구사항에 따라 달라질 수 있습니다.

이와 같이 파일 분할을 수행하여 대용량 파일을 처리할 수 있습니다.

이를 통해 대용량 파일을 빠르게 처리할 수 있으며, 메모리 사용량도 줄일 수 있습니다.

파일 분할은 대용량 파일 처리에 있어서 매우 중요한 기술 중 하나이므로,

이를 활용하는 방법을 꼭 알아두시면 좋을 것 같습니다!

오늘도 긴 포스트 읽어 주셔서 감사합니다!

다음에는 다른 대용량 파일 처리 방법들에 대해 알아보겠습니다.

교육 & 프로젝트 문의

tfkeras@kakao.com

 

댓글