그때그때 CS 정리

코드에서 배치 처리가 효율성을 가져오는 이유

필만이 2024. 9. 5. 11:48

배경

  • pdf-rag를 제작할때, 많은 장수의 pdf를 처리하고 저장해야 했는데 for문으로 한장씩 처리해 속도가 느렸다.
  • 더 빠른 방법이 없을까 고민하다 batch 처리에 대해 알게 됐고, 무지하게 빨라져 그 이유가 궁금해 찾아봤다.

내 코드에서 배치 처리가 빨랐던 이유

1. I/O 효율성 - 디스크 접근 및 파일 처리 최적화

파일을 한 번에 작은 단위로 나누어 처리하는 대신, 여러 페이지를 한꺼번에 배치로 처리함으로써 디스크 I/O 작업을 최적화할 수 있습니다. 디스크 접근은 일반적으로 매우 비용이 많이 드는 작업입니다. 파일을 여러 번 나누어 읽고 쓰면, 각 I/O 작업마다 디스크의 시작 및 탐색(Seek) 시간파일 시스템 오버헤드가 발생합니다.

  • 디스크 접근 시간: 디스크에서 데이터를 읽고 쓰는 시간은 랜덤 접근(random access)보다 순차적 접근(sequential access)이 훨씬 빠릅니다. 배치로 처리하면, 여러 페이지를 한 번에 읽고 순차적으로 처리하므로 디스크 헤드 이동이 최소화되어 I/O 성능이 향상됩니다.
  • 읽기/쓰기 작업의 빈도 감소: 배치 크기가 클수록 파일을 읽고 쓰는 작업의 빈도가 줄어들어 디스크의 부하를 줄일 수 있습니다.

2. 메모리 관리 및 캐시 효율성 - 캐시 적중률 증가

배치로 많은 데이터를 한 번에 처리하면, 메모리 캐시를 더 효율적으로 활용할 수 있습니다. 특히, 디스크에서 데이터를 읽어올 때 운영 체제(OS)의 파일 시스템 캐시에 의해 자주 사용되는 데이터가 메모리에 캐싱되므로, 같은 파일을 여러 번 반복해서 읽어오는 경우보다 캐시 적중률(cache hit rate)이 높아집니다.

  • CPU 캐시: 배치로 처리하면, 동일한 작업을 여러 번 반복하는 것보다 메모리에 많은 데이터를 적재한 상태에서 여러 페이지를 한꺼번에 처리하게 되어 CPU 캐시 적중률이 증가합니다. 이는 메모리 접근 시간을 줄여 성능을 향상시킵니다.

3. 루프 오버헤드 감소 - 반복 작업의 최적화

배치로 처리하면, 루프의 반복 횟수가 줄어들어 루프 실행에 따르는 오버헤드가 감소합니다. 각 루프에서:

  • 파일을 열고 닫거나,
  • 페이지를 추출하고,
  • 결과 파일을 저장하는 작업이 있습니다.

루프 횟수가 줄어들면 이러한 반복적인 작업이 적게 발생하여 성능을 더 효율적으로 사용할 수 있습니다. 루프의 반복이 많을수록 스택에 쌓이는 함수 호출 오버헤드컨텍스트 스위칭 비용이 증가할 수 있지만, 배치를 통해 그 횟수를 줄일 수 있습니다.

4. 디스크 쓰기 병목 최소화 - 쓰기 작업을 줄여 디스크 병목을 완화

배치로 페이지를 처리하는 과정에서 여러 페이지를 한 번에 PDF로 저장하게 됩니다. 이는 개별 페이지를 여러 번 저장하는 것보다 디스크 쓰기 작업의 빈도를 줄이고, 병목 현상을 완화할 수 있습니다.

특히, 디스크 쓰기 작업은 파일을 저장할 때 운영 체제에 의해 디스크 버퍼에 데이터를 쓰는 과정이 포함됩니다. 데이터를 여러 번 저장하면 버퍼 플러시(buffer flush)가 빈번히 발생하여 성능이 저하될 수 있지만, 배치 처리를 통해 이러한 플러시를 최소화할 수 있습니다.

5. 파일 시스템과 운영 체제의 최적화 - 입출력 병합

배치로 많은 양의 데이터를 처리하면 운영 체제의 파일 시스템 최적화 기법을 더 잘 활용할 수 있습니다. 예를 들어, OS는 입출력 병합(I/O merging)과 같은 최적화 기법을 사용하여 여러 개의 작은 I/O 요청을 하나의 큰 I/O 요청으로 병합해 성능을 향상시킵니다.

  • I/O 병합: 배치로 데이터를 처리할 때, 여러 페이지를 한 번에 저장하면 OS가 이를 하나의 연속된 I/O 작업으로 처리해 디스크 성능을 최대한 활용할 수 있습니다. 따라서 파일 입출력의 효율성이 증가합니다.

6. CPU와 I/O의 병렬성 - I/O 작업 중 CPU 대기 시간 최소화

배치 처리를 통해 I/O와 CPU 작업의 병렬성을 극대화할 수 있습니다. 배치 처리 중 I/O 작업을 수행하는 동안, CPU는 다른 배치나 작업을 준비할 수 있습니다. 작은 단위로 처리할 경우 I/O 작업이 끝날 때까지 CPU가 대기해야 하는 시간이 길어질 수 있지만, 배치 처리는 대기 시간을 최소화하여 CPU와 I/O 리소스를 더 효율적으로 사용할 수 있습니다.

몇 가지 병렬처리 비교

https://makenow90.tistory.com/65