안녕하세요?

 

지난번 포스팅에서는 어떻게 헛다리를 짚는 바람에 이래저래 힘이 빠지는 현상이 벌어지기는 했는데, 그건 그것이고, 아무튼 간에 계속해서 어디서 누수가 일어나는 지에 대해서 한번 잡아 보도록 해야 했습니다. 그래서 이번 포스팅에서는 그런데로 성공적인 방법이 나왔고, 그렇게 해서 잡은 메모리가 새어 나가는 지점에 대해서 이야기를 해 보고자 합니다.

이 작업을 위해서는 파이썬에 원래 내장되어 있는 모듈인 tracemalloc이라는 라이브러리를 먼저 import해서 가지고 와야할 필요성이 있습니다.

그리고 나서 위 스크린샷에서 볼 수 있는 것처럼 일단 self가 붙은 변수를 하나 만들어서 놓도록 하고, 다음 작업에 들어가 보기로 합니다.

그리고 나서 for문이 시작하는 지점에서 take_snapshot()이라는 메서드를 사용하는 것으로 일단 첫번째 탐침을 찍어 놓도록 합니다.

그리고 for 루프가 한번 끝나는 마지막 지점에 위 스크린샷과 같은 형식의 두번째 탐침을 찍어주는 것으로 이제 어디서 어떤 일이 벌어진 것인지 알아보기 위한 준비에 들어가 봅니다.

 

 

그런데 자세히 생각해 보니, 위 스크린샷에서 볼 수 있는 것처럼 for 루프의 밖에다가 첫번째 탐침을 찍어 주도록 했습니다. 이렇게 하면 for루프가 진행이 되는 정도에 따라서 어디서 메모리가 누수되었는지 알 수 있기 때문입니다.

그런데 첫 시작을 하자마자 에러가 나 버렸습니다. 처음에는 이게 무슨 에러인가 했더니, 생각해 보면 상당히 간단한 에로를 낸 것이었습니다.

사실은 self.가 붙은 변수를 만들어 낼 필요가 애초에 없었습니다. 위 스크린샷처럼 그냥 tracemalloc을 그대로 불러 오기만 하면 되는 것 입니다.

그래서 기존에 self가 붙은 변수가 들어가 있었던 부분은 그냥 tracemalloc으로 통일해서 만들어 주는 작업을 다시금 해야만 했습니다.

 

그리고 두번재 지점도 역시나 위치만 같을 뿐, 앞에 있었던 self가 붙은 변수는ㄴ 제거해 주고, tracemalloc을 그래도 가지고 와서 두번재 작업을 하도록 합니다.

그런데 약간은 어이가 없는 결과라고 해야 할까요? 일단 위 스크린샷에서 보이는 것처럼 우선 그렇게 시간이 많이 걸렸지만, 에러가 나오기 까지 그냥 2종목만 건드리고 끝입니다.

단지 이 2 종목을 했을 뿐이지만, 완전히 헛된 것은 아니기에, 위스크린샷을 보시면 알 수 있듯이, 일단 처음에 34MB이던 같은 py파일 같은 줄에서 그 냥이 2배 가까이 메모리를 차지하는 양이 늘어난 것을 확인할 수 있었습니다.

거기다가 마무리로 한번 파이참의 디버그 모드를 이용해서 정확하게 무슨 에러인지 알아보니, 위 스크린샷에서 언급한 바와 같이 메모리 에러였습니다. 다만 이게 그냥 메모리 에러가 아니라, 어찌된 것인지 제가 짠 코드랄까 matplotlib이라는 모듈에서 에러가 나오고 있습니다. 물론 이 라이브러리 자체의 문제라기 보다는 아마 제가 다루면서 실수가 있은 듯 합니다만, 일단 이 에러라는 것은 알았으니, 이제 수정하려 가 보도록 하겠습니다.

+ Recent posts