Python의 메모리 누수
메모리 누수는 디버깅 및 수정이 어려울 수 있는 일반적인 프로그래밍 문제입니다.
이 기사에서는 크고 작은 예제 프로그램을 사용하여 Python 메모리 누수를 살펴봅니다. 메모리 누수의 원인을 찾는 방법과 해결 방법을 살펴보겠습니다.
Python의 메모리 누수
이 기사에서는 Python 메모리 관리 시스템의 내부에 대해 논의하지 않습니다. 하지만 Python 메모리 시스템이 어떻게 작동하는지 궁금하다면 Python의 표준 라이브러리의 소스 코드와 다른 고급 프로그래밍 언어의 코드를 참조할 수 있습니다.
이제 Python의 메모리 누수를 연구하기 위해 예제에서 사용할 일부 라이브러리에 대해 논의해 보겠습니다. 첫 번째 라이브러리는 특정 URL에 HTTP 요청을 할 수 있게 해주는 Requests 라이브러리입니다.
REST API든 웹 스크래핑이든 이러한 기술을 사용하기 전에 요청을 학습해야 합니다. 요청이 URL로 전송되면 응답이 반환됩니다.
Python 애플리케이션에는 요청 및 응답 모두에 대한 기본 제공 관리 기능이 포함되어 있습니다.
다음 명령을 사용하여 쉽게 설치할 수 있습니다.
pip install requests
requests
라이브러리를 설치했으면 이제 GC 모듈을 설치합니다. Python 가비지 수집기에 대한 액세스 권한을 제공합니다.
수집기 활성화, 수집기 비활성화, 수집 빈도 조정, 디버깅 등의 옵션이 있습니다.
C 및 C++와 같은 저수준 언어에서는 프로그래머가 더 이상 사용하지 않는 리소스를 수동으로 해제해야 합니다. 달리 말하면 리소스를 관리하는 프로그래밍을 개발하십시오.
그러나 Python 및 Java와 같은 고급 언어에는 자동화된 메모리 관리인 쓰레기 수집 개념이 포함되어 있습니다. 휴지통 수집은 프로그램의 메모리 할당 및 해제를 담당합니다.
우리가 사용할 GC 모듈의 메서드는 쓰레기 수집에서 추적 객체를 제공하는 메서드인 get_object()
입니다. 또한 collect()
메서드를 사용하여 수집기가 제어하는 목록에서 참조되지 않은 객체를 제공합니다.
Python에서 메모리 누수 식별
이제 프로그램을 실행하는 동안 메모리 누수가 있는지 확인하는 방법에 대해 설명합니다. 예제로 시작하고 위에서 언급한 라이브러리를 사용하여 누수가 있는지 확인하십시오.
먼저 이 예제의 앞부분에서 언급한 라이브러리를 가져옵니다.
# python
import requests
import gc
그런 다음 요청 라이브러리를 사용하여 google.com
에서 응답을 요청하고 받은 상태 코드를 반환하는 getGoogle()
함수를 정의합니다.
암호:
# python
def getGoogle():
resultGot = requests.get("https://google.com")
print("Status Code recieved is ", resultGot.status_code)
return
이제 다른 함수인 checkMemoryLeak()
을 정의하여 getGoogle()
함수를 호출하기 전과 후에 가비지 객체를 수집합니다.
암호:
# python
def checkMemoryLeak():
print("Memory Leaked before calling getGoogle()")
print(len(gc.get_objects()))
getGoogle()
print("Memory Leaked before calling getGoogle()")
print(len(gc.get_objects()))
checkMemoryLeak()
출력:
예제에서 볼 수 있듯이, 함수를 호출하기 전에는 가비지 컬렉터의 길이가 17472였고, 함수를 호출한 후에는 길이가 17698로 늘어났습니다. 일부 작업을 수행할 때 항상 메모리 누수가 있음을 보여줍니다.
이제 메모리 누수를 수정하고 메모리 누수 없이 최대한 많은 데이터를 수집하는 방법에 대해 논의하겠습니다.
Python에서 메모리 누수 수정
gc.collect()
함수를 사용하여 Python에서 메모리 누수를 수정할 수 있습니다. 동일한 프로그램을 사용하지만 메모리 누수가 없거나 최소화되도록 수정합니다.
이 예에서는 getGoogle()
함수를 호출한 후 gc.collect()
를 직접 호출하여 메모리 누수를 줄이고 문제를 해결합니다.
암호:
# python
import requests
import gc
def getGoogle():
resultGot = requests.get("https://google.com")
print("Status Code recieved is ", resultGot.status_code)
def checkMemoryLeak():
print("Memory Leaked before calling getGoogle()")
print(len(gc.get_objects()))
getGoogle()
gc.collect()
print("Memory Leaked before calling getGoogle()")
print(len(gc.get_objects()))
checkMemoryLeak()
출력:
예제에서 볼 수 있듯이 gc.collect()
를 사용하면 메모리 누수가 줄어듭니다. 따라서 이러한 방식으로 함수 호출 중에 메모리 누수를 방지할 수 있습니다.
Rana is a computer science graduate passionate about helping people to build and diagnose scalable web application problems and problems developers face across the full-stack.
LinkedIn