[Python libs] matplotlib 사용시 메모리 누수

1 minute read

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