본문 바로가기
무모한 도전-주식 인공지능 만들기

메모리 누수를 잡기위한 여정 part1

by 인터넷떠돌이 2019. 6. 22.
반응형

안녕하세요?

 

지난번 포스팅에서 비록 수익을 꾸준히 제 인공지능 주식 투자자가 내고 있기는 하지만, 메모리를 점점 사용량이 많아져서 문제가 생기는 것을 볼 수 있었습니다. 그래서 이번 포스팅 부터는 이 문제를 해결하기 위해서 일련의 과정을 밟아 보도록 했는데, 그 내용을 연속해서 포스팅 할까 합니다.

 

일단 위 스크린샷을 보시면 contextlib이라는 내장 모듈이 있는데, 이 모듈을 가지고 와서, 자동으로 close명령을 보장해 주는 closing을 사용해 주도록 합니다.

 

그 다음에는 기존에 있던 문장에서 while을 없애 주도록 합니다. 이렇게 하는 것은 while문을 쓰지 않고 다른 방식으로 루프(loop)를 만들려고 하기 때문입니다.

 

if __name__ == '__,main__':에서 위 스크린샷과 같이 main에서 with문을 이용해서 멀티 프로세스를 만들어 주도록 하고, 다음으로는 main2에서 main()을 부르도록 만들어 줍니다.

 

이제 본격적으로 작동이 잘 되는지 아닌지 여부를 알아보기 위해서, 위 스크린샷과 같이 pytrader를 작동 시켜서 1분봉 차트를 가지고 오도록 합니다.

 

 

그런데 어떻게 된  셈인지는 몰라도, action_list가 2개 밖에 생성이 되지 않는 것을 볼 수 있었습니다. 이렇게 해서 제대로 동시에 실행이 되지 않는 것을 보니까.......

 

위 스크린샷처럼 MyStockTrader가 1번에 1개씩만 작동을 하는 것을 확인할 수 있기는 있었습니다. 즉, 1번 자식 프로세스가 끝나면 다음 자식 프로세스가 실행되는  식이라서, 제가 생각한 것과 차이가 많았습니다.

 

그래서 한번 위 스크린샷처럼 with문을 다르게 사용해서 한번 작업도 해 보고자 했습니다만, 이렇게 했어도 결과는 크게 달라지는 것이 없었습니다.

 

그래서 if문 때문인가 생각해서 한번 if문을 제거해 보기도 했지만, 결과가 크게 달라지는 것을 볼 수 없기도 없었습니다. 이래서야 안하느니만 못한 결과가 되었습니다.

 

혹시 변수로 사용이 된 number2가 with문 밖에 있어서 이런가 싶어서 위 스크린샷처럼 with문 안쪽으로 만들어 주기는 주었어도, 별로 변한 것은 없었습니다.

 

그래서 with문을 그냥 주석처리를 하도록 하고, 기존의 방식을 그대로 사용해 보도록 하였습니다. 물론 많이 돌아가는 것이기는 하지만, 일단 이렇게 해서 병렬로 동시에 실행이 되는지 알아보고자 했습니다.

 

그렇게 하니까, 위 스크린샷처럼 어떻게 해서 병렬로 처리가 되기는 되는 것을 확인할 수 있기는 있었습니다. 그러나 한가지 문제가 있었으니.......

 

다시금 메모리의 사용량이 점점 시간이 지나면서 많아지기 시작하는 문제점을 발생시키기 시작하는 것 입니다. 결국 contextlib을 이용한 방법은 다시 원점으로 돌아오고 말기는 말았습니다. 이제 여러가지 방법을 다시금 다른 식으로 시도해 볼 차례입니다.

반응형