프로그래밍 언어/python

matplotlib 사용시 메모리 누수

이현찬 2022. 7. 26. 21:29
728x90

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