[Python libs] matplotlib 사용시 메모리 누수
Memory Leakage
- 프로그램이 불필요한 메모리를 점유하고 있는 것을 메모리 누수(memory leakage)[1]
- 메모리 누수를 발생시키는 요인 중 matplotlib 라이브러리를 사용할 때 메모리 누수가 발생하기 쉬움
- 각 iteration마다 이미지를 그리는데 필요한 메모리를 할당하고 이미지를 저장하는데 다음 iteration으로 넘어가도 해당 메모리를 점유하기 때문에 다음과 같은 경우에 메모리 누수가 발생
-
메모리 사용량 추적을 위해 다음 블로그의 코드를 사용했습니다.[2]
import matplotlib.pyplot as plt import numpy as np memory_ = np.zeros(100) dummy_data = np.random.rand(100,100,100,3) for i in range(100): plt.imshow(dummy_data[i,:]) memory_use = _check_usage_of_cpu_and_memory() memory_[i] = memory_use
- 메모리 사용량이 iteration이 진행됨에 따라 꾸준히 증가하는 것을 볼 수 있음
plt.clf()[3]
- figure 창 내의 plot을 지우는 방법
- 이미지를 저장한 후 plt.clf()를 붙여줌
plt.close(‘all’)[3]
- figure 창 자체를 지우는 방법
-
이미지를 저장한 후 plt.close(‘all’)을 붙여줌
- 둘 다 memory에서 figure를 해제하는 방법이지만 특정 상황에서 memory 해제가 안되는 문제가 있음[4]
- 마음 편하게 둘 다 붙여주면 matplotlib 사용으로 인한 메모리 누수 문제는 해결됨
memory_2 = np.zeros(100) plt.close('all') plt.clf() dummy_data = np.random.rand(100,100,100,3) for i in range(100): plt.imshow(dummy_data[i,:]) memory_use = _check_usage_of_cpu_and_memory() memory_2[i] = memory_use
- 메모리 사용량이 증가하지 않음
Reference
[1] wikipedia
[2] python에서 프로세스의 cpu 사용량과 memory 사용량 체크하기
[3] Matplotlib의 cla(), clf() 및 close() 메서드의 차이점
[4] Stack Overflow