파이썬/파이썬-AI 기본

데이터 중복성 검사와 병렬 처리에 대하여

용사냥꾼69 2023. 4. 24. 20:26
728x90

데이터 중복성 검사에서 병렬 처리

 

데이터를 다루다보면, 반드시 중복성 검사... 일관성 검사 같은 종류의 것들을 해야할 때가 있다.

 

최근에 특정 조건에서 수십만 개의 데이터 속, 중복된 것을 찾아야 했는데 코딩 테스트에서의 마법같은 기술이 전혀 먹히지 않는 그러한 문제였다. (코테를 잘하는 편도 아니지만)

 

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 ...      
                   
                   
                   
                   
                   
                   
                   
          ... 97 98 99 100

 

이런 종류의 문제에 대하여 1번 데이터를 2~100번까지 검사하고, 2번 데이터를 3~100까지, 3번 데이터를 4~100까지 검사하는 n번 데이터를 n+1번부터 검사시키는 방법이 가장 단순하지만, 신뢰성이 높은 방법이다.

 

신뢰성이 중요한 문제였고, 딱히 다른 방법도 생각나지 않았기 때문에 시간을 줄이는 방법은 병렬처리라고 생각했다.

 

결국 방법은 현재 사용할 수 있는 8개의 CPU를 전부 활용하여 병렬처리 하는 것이라고 판단했다.

 

더 나은 방법이 있으리라 생각하지만, 현재 내 수준과 가진 장비로는 그게 최선이었다...

 

8개의 CPU로 병렬처리를 한다면, 1개의 CPU에다가 데이터를 어떻게 할당 시켜야 하는가?

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 ...      
                   
                   
                   
                   
                   
                   
                   
          ... 97 98 99 100

 

그냥 단순히 전체를 8등분하여 잘라넣는게 좋을까?

 

100 / 8 -> 대략 12개 정도니까

1~12를 1번째 CPU에

13~24를 2번째 CPU에... 이런 식으로?

 

앞서 보았듯이 n번 데이터는 n+1번 데이터부터 끝까지 검사를 해야하므로, 뒤쪽 index에 속한 데이터일수록 해야할 작업량이 적어진다.

 

 

----------------------------------------------------------------------------------

 

완료까지 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~#

1번 CPU ######

2번 CPU ##########

3번 CPU ###############

...

...

8번 CPU ################################### -> "완료"

 

----------------------------------------------------------------------------------

 

이런 식으로 8번 CPU가 먼저 끝나게 된다.

 

이에 따라서 작업을 쉬는 CPU가 생겨버리고, 이를 해결하기 위해 다른 시스템을 구축하는 것보다는 데이터 분배를 좀 더 효율적으로 할 필요가 있다고 느꼈다.

 

 

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
               
               
               
               
               
               
               
          ... 99 100

 

이렇게 색깔별로 각 CPU에 넣어준다면 약간의 차이는 있어도 각각 작업이 끝나는 속도가 비슷하게 될 것이다.

 

1, 9  -> 1번 CPU

2, 10 -> 2번 CPU

3, 11 -> 3번 CPU

4, 12 -> 4번 CPU

...

...

 

그럼 생각은 나름 합리적이라고 판단하고, 이를 파이썬 코드로 만들어야 한다.

 

## cpu 갯수만큼 n번 나누고 위에 설명한 것처럼 넣어야 할 index를 리스트로 저장한다

dis_list = []

for n in range(8):
	dis_list.append([x for x in range(n + 1, 100, 8)])

 

이렇게 간단하게 분배할 index가 담긴 리스트를 만들 수 있다.