파이썬에서 병렬처리를 한다는 것...파이썬에 대해 좀더 deep하게 알아야하는 과정이 필요한 것 같은데?
가령 cpu나 램은 파이썬에서 어떻게 동작하는게 효율적인가 같은.
그런데 그걸 하나하나 다 뜯고 공부한 후에 프로그램을 짤 시간이 없었다. 기한 안에 어떻게든 만들어야했기에 선택권이 없는 상황에 처했다.
그래서 어떻게..? 그냥 했다. 무작정. 되는대로. 손이가는대로. 마음가는대로.
파이썬에서 특정 라이브러리를 꼭 써야하는 일이 있었는데 이 글에서는 geopy를 예시로 글을 써보겠다.
해당 라이브러리는 좌표계 변환을 위해 사용하는 것인데, geopy의 geodesic
이 정확도가 높은 대신에 속도가 엄청나게 느리다.
어느정도 정확도를 포기하고 속도를 빠르게 하고싶다면 great_circle
이라는 놈을 사용하면 된다. geodesic보다도 약 20배가량 빠르다고 한다.
하지만 난 정확도도 놓칠 수 없는 상황이었다. 조금의 오차도 허용할 수 없는...
다시 말해 geodesic을 사용하면서 속도는 빠르게 처리할 수 있게끔 해야하는 상황이었는데..
단순한 작업이지만 한번 처리하는데 속도가 오래 걸린다면 여럿이서 단순 작업을 시킨다면?
그래서 해당 작업을 병렬처리하기 위해 multiprocessing.pool.appy_async를 사용하였다.
그런데...
문제
RuntimeError: can't allocate lock
과 같은 에러가 나타났다.
저 에러가 나오는 것도 복불복이다. 병렬처리 하는 양이 어느 임계점을 넘었을 때 저 에러가 나타난다.
작업관리자(ctrl+shift+esc)를 통해 cpu와 메모리 사용량을 확인해보면 메모리만 엄청나게 먹고 cpu의 사용량이 별로 없었다.
그말인 즉슨 apply_async로 사용하니 리어카는 잔뜩 있지만 일하는 노예가 하나밖에 없는 상황?
내 노예가 혼자 이 많은 리어카를 짊어질 수 없다며 리어카를 던져버린 상황..?
해결책
이것저것 시도해보다가
multiprocessing.pool.map_async
를 사용하는 것으로 바꾸었더니 이게 웬일...
cpu의 사용량이 급등하면서 RuntimeError: can't allocate lock 에러가 사라졌다.
근데 파이썬에서 cpu사용하는 것을 지양해야한다고 하는데... 이렇게 해도 되나 싶다.
일단 되니까 써먹고 있는데 이런걸 좀 자세히 알고싶은데 우찌해야할 지 모르겠는 상황이요...
궁금한 건 왜
- 파이썬에서 왜 멀티스레드가 아닌 멀티프로세스를 지향하나?
- 멀티프로세스에서 pool과 process의 정확한 차이는 뭔가? 둘다 써본 결과 pool이 확실히 더 빠르기에 pool을 쓰고는 있다지만...
- pool내에서 apply_async와 map_async의 차이는 뭔가?
- cpu보다도 gpu의 처리가 훨씬 빠르다고 하는데 gpu를 끌어다 쓸 수 있는 방법은 없는가?.
공부해야할 것이 참 많다... 사실 재미는 있지만 ㅇ갈피를 조금 잡아줄 사람이 있으면 좋겠는 요즘이다.
참고
https://stackoverflow.com/questions/57178576/speed-up-getting-distance-between-two-lat-and-lon
Speed up getting distance between two lat and lon
I have two DataFrame containing Lat and Lon. I want to find distance from one (Lat, Lon) pair to ALL (Lat, Lon) from another DataFrame and get the minimum. The package that I am using geopy. The co...
stackoverflow.com
'파이썬 문법' 카테고리의 다른 글
파이썬 타입 지정하기 (0) | 2022.07.30 |
---|---|
언어의 성능에 일희일비 하지 말기 (0) | 2022.07.24 |
파이썬 리스트에 요소 추가 시 주의하기 (feat.속도) (0) | 2022.07.02 |
논리연산자 실행시 주의사항 (0) | 2019.10.04 |
변수(Variable) (0) | 2019.09.03 |