로컬 컴퓨터 메모리로 처리 가능할 정도의 코드를 구성하는 방법은 쉬운 접근법이 가능하다. 배열들 하나 하나에 인풋, 중간 산출물, 아웃풋을 담아서 한번에 처리하면 된다. 그러나 이 배열들 하나마다 원소의 개수가 너무 많아진다면 한번에 배열에 담지 못하게 된다. 그래서 중간 결과물들을 쪼개서 가용 가능할 정도로만 메모리에 올려서 처리하는 방법이 필요하게 된다. 이때, 처리 기준이 되는 단위로 쪼개는 방법과 쪼개서 처리한 결과를 원래의 구성과 같게 병합하는 과정도 필요하다.
대량의 데이터에 대하여 OpenAI API를 호출해야 하는 상황이 있었다. ThreadPoolExecutor를 사용하여 멀티 쓰레딩으로 API를 병렬처리하면 훨씬 빠르게 수행 가능하다. 아래와 같은 방식으로 수행 가능하다.
with ThreadPoolExecutor(max_workers=(multiprocessing.cpu_count())) as execute:
futures = {execute.submit(process, data): data for data in data_l}
for i, future in enumerate(as_completed(futures)):
resp_result = future.result()
그러나 데이터를 병렬 처리하다 보면 병렬처리를 위해 작은 단위로 쪼갠 후에 다시 원래의 데이터 형태로 병합하거나 일부를 수정해야 하는 경우가 발생한다. 이때, 원래의 데이터와 쪼갠 데이터 간의 연결고리가 필요하고 쪼갠 데이터에서 원래의 데이터와 연결할 수 있는 연결고리를 포함하고 있는 방법도 있고 연결고리만을 들고 있는 새로운 데이터를 구성하는 방법도 존재한다.
원래의 데이터가 작은 데이터 들이 모여 있는 데이터 들이라면 이렇게 쪼개고 다시 병합하는 과정이 다소 복잡해진다. 또한 여기에다가 일정 숫자의 데이터 처리 이후에 중간 과정을 저장하는 프로세스가 추가 된다면 더욱 어려워지게 된다.
예를 들어서 다음과 같은 요구사항이 존재한다. 작은 컴포넌트 c가 1~20개가 모여서 d1, d2, d3, d4, d5 ... 를 이룬다고 하자. 초기에 받은 데이터는 d1, d2, d3 ... 이고 이 안에 c1, c2, c3 ... 등이 배열로 존재한다. 이때, 각 d1, d2, d3 ... 의 c에 대해서 작업을 병렬로 수행 후에 처리 결과를 다시 d1, d2, d3 ... 안의 c 배열에 반영 해야 되는 프로세스 라면 다소 복잡해진다. 그리고 c에 대한 작업 수행이 100개가 될 때마다 처리 결과를 저장해야 한다.
'CS > Python & C++' 카테고리의 다른 글
LLM을 활용한 코드리뷰 자동화 (1) | 2025.04.27 |
---|---|
파일 다루기 (0) | 2025.01.17 |
람다 식(Lambda Expression)과 STL 알고리즘 (0) | 2024.03.04 |
C++의 문자열 std::string (0) | 2024.02.15 |
이동 생성자 & 이동 대입 연산자 (0) | 2024.01.29 |