How to Fix Memory Leaks in Python?

SeungHyuk Shin·2022년 4월 14일
2
post-thumbnail

원 글을 번역한 글입니다.

파이썬에서는 메모리 스토리지가 중요한 역할을 하지만 메모리 누수로 인해 스토리지 문제가 발생할 수 있습니다. 모든 프로그램이 효율적으로 작동하려면 메모리가 중요합니다. 메모리는 프로그램이 지시를 받고 데이터를 저장하는 데 도움이 됩니다.

사용하지 않은 데이터가 쌓여 삭제하지 않으면 Python 프로그램에서 메모리 누수가 발생합니다. Python의 경우 최적의 성능을 제공하려면 메모리 누출을 진단하고 해결해야 합니다.

하지만, 어떻게 이것이 달성될 수 있을까요?

메모리 누수가 무엇인지, 누수의 원인 및 이러한 메모리 문제를 해결하는 데 사용할 수 있는 방법을 이해해야 합니다. Python 코드의 모든 부분에서 사용되는 메모리를 확인하는 데 도움이 되도록 메모리 프로파일링을 수행해야 합니다.


What is a memory leak?

메모리 누수란 불필요한 메모리가 해제되지 않은 컴퓨터 프로그램에서 메모리 할당을 잘못 관리하는 것입니다. 사용하지 않는 개체가 메모리에 쌓이면 프로그램에서 메모리 누수가 발생합니다.

메모리 누수가 발생하면 프로그램의 저장 공간이 가득 차서 저장 공간이 줄어듭니다. 공간이 부족하면 프로그램이 파괴되거나 느리게 작동하기 시작할 수 있습니다.

프로그래머는 대용량 메모리를 만든 다음 메모리를 릴리스하지 못할 수 있습니다. 프로그램이 더 많은 메모리를 사용하고 메모리를 해제하지 않으면 서버의 메모리 풀이 시간 내에 소모됩니다. 이로 인해 다음 번에 더 많은 메모리를 사용할 때 응용 프로그램이 중단될 수 있습니다.

메모리 누수는 프로그래머들이 C&C++만 사용할 때 더 흔했습니다. 이는 응용 프로그램에서 메모리를 수동으로 해제해야 했기 때문입니다.

응용 프로그램이 실행 중이고 오래된 데이터가 레지스터에 쌓이면 더 많은 메모리가 사용됩니다. 그런 다음 프로그램이 실행을 중지하여 메모리를 확보합니다. 그러나 응용 프로그램이 충돌할 경우 프로그램 작동이 중지될 수 있습니다.


What causes memory leaks in Python?

파이썬 프로그램은 다른 프로그래밍 언어와 마찬가지로 메모리 누출을 경험합니다. 가비지 수집기가 Python에서 참조되지 않거나 사용되지 않은 데이터를 릴리즈하지 않으면 Python의 메모리 누수가 발생합니다.

파이썬 개발자들은 사용하지 않는 메모리를 자동으로 풀어주는 기능을 추가함으로써 메모리 누출을 해결하려고 노력해왔습니다.

그러나 일부 참조되지 않은 객체가 가비지 수집기를 무사히 통과하여 메모리 누출을 초래할 수 있습니다.

다음은 파이썬에서 메모리 누출을 일으킬 수 있는 요인입니다.

해제되지 않은 큰 객체가 메모리에 남아 있는 경우

도메인 컨트롤러가 tombstone lifetime보다 긴 시간 간격 동안 복제할 수 없는 경우 잔여 개체가 발생합니다.

그런 다음 도메인 컨트롤러가 replication topology에 다시 연결합니다.

도메인 컨트롤러가 오프라인 상태일 때 Active Directory 서비스에서 개체를 삭제하면 해당 개체가 도메인 컨트롤러에 남아 있는 개체로 유지됩니다. 메모리 누수의 발생으로 이어지는 공간을 소비하는 것은 바로 그 객체입니다.

코드의 참조 스타일

참조 스타일에 따라 메모리 누출을 발생시킬지 또는 방지할지가 결정됩니다.

참조에는 참조 중인 개체에 대한 주소 및 클래스 정보가 있습니다. 참조를 할당해도 고유한 중복 개체가 생성되지 않습니다. 그러나 개체가 더 이상 사용되지 않고 응용 프로그램 내의 다른 위치에서 참조되고 있기 때문에 가비지를 수집할 수 없는 경우에는 메모리 누수가 발생합니다.

코드 참조에는 다양한 유형의 참조가 사용되며, 가비지 수집 기능이 다릅니다.

강한 참조 스타일은 일상 프로그래밍에서 가장 편리하게 사용할 수 있습니다. 하지만 강한 참조가 붙어 있는 물체는 가비지 컬렉터를 어렵게 만듭니다. 이런 경우 메모리 누수가 발생합니다.

강한 참조란?

import sys


class RefExamVal:
    def __init__(self, val):
        self.val = val
        print('create RefExamVal object')

    def __del__(self):
        print(f'destroy P = {id(self)}')


class RefExam:
    def __init__(self, p: RefExamVal):
        self.p = p
        print('create RefExam object')

    def __del__(self):
        print(f'destroy RefExam = {id(self)}')


ap = RefExamVal(1)
print(f'ap count {sys.getrefcount(ap)}')
a = RefExam(p=ap)
print(f'ap count {sys.getrefcount(ap)}')
ap = None
print(a.p)
a = None
print('end .....')




# a.p를 참조하는 ap를 None으로 초기화 했지만 여전히 참조하고 있어 가지비 컬렉터가 발견을 하지 못함.
# RefExam 객체가 파괴될때 같이 파괴됐다.

############## out put ##################

create RefExamVal object
ap count 2
create RefExam object
ap count 3
<__main__.RefExamVal object at 0x0000013A12EABFD0> # 여전히 RefExamVal 인스턴스를 참조중
destroy RefExam = 1348937105072
destroy P = 1348937105360
end .....

기본 라이브러리

파이썬은 시각화, 모델링, 데이터 처리를 위해 여러 라이브러리를 사용합니다. 파이썬 라이브러리는 파이썬 데이터 작업을 훨씬 쉽게 만들지만 메모리 누수와 관련이 있습니다.

Methods to fix memory leaks

프로그램이 중단되기 전에 메모리 누출을 진단하고 수정해야 합니다. 파이썬 메모리 매니저는 파이썬 메모리 누수와 관련된 문제를 해결합니다. 이 애플리케이션은 데이터를 읽고 쓸 수 있습니다.

또한 메모리 관리는 사용되지 않는 데이터를 메모리에서 지우는 역할을 합니다. 사용하지 않는 모든 데이터가 메모리에서 정리되므로 메모리의 효율성을 높이는 데 도움이 됩니다.

파이썬에 내장된 CPython은 가비지 수집기가 메모리에서 제거하기 위해 사용되지 않는 데이터와 참조되지 않은 데이터를 선택하도록 하는 기능을 합니다.

파이썬을 사용하는 프로그래머라면 메모리 누출을 걱정할 필요가 없습니다. CPython은 참조되지 않은 데이터에서 발생하는 모든 가비지를 메모리에서 제거하도록 가비지 수집기에 자동으로 알립니다.

메모리 누출 문제는 가비지 수집기에 의해 자동으로 정렬될 수 있지만, 경우에 따라 실패할 수도 있습니다. 따라서 메모리 누수와 관련된 문제를 해결하기 위해 몇 가지 방법을 적용해야 합니다.

메모리 누출을 해결하기 위한 디버깅 방법 사용

가비지 수집기 내장 모듈을 사용하여 Python의 메모리 사용량을 디버깅해야 합니다. 그러면 가비지 수집기가 알고 있는 개체 목록이 제공됩니다.

디버깅을 통해 파이썬 스토리지 메모리의 많은 부분이 어디에 적용되고 있는지 확인할 수 있습니다. 그런 다음 사용량에 따라 모든 항목을 필터링할 수 있습니다.

사용하지 않는 개체가 발견되어 참조된 경우 메모리 누출을 방지하기 위해 해당 개체를 삭제하여 제거할 수 있습니다.

Python의 메모리 누수 문제를 정렬하기 위한 tracemalloc 적용

파이썬을 사용하는 장점 중에는 tracemalloc과 같은 최고 수준의 내장 기능이 있습니다. 이 모듈은 Python의 메모리 누수에 관한 한 빠르고 효과적인 솔루션을 제공합니다. tracemalloc을 사용하여 개체를 처음 할당된 정확한 위치에 연결할 수 있습니다.

Tracemalloc을 사용하면 프로그램 내에서 메모리를 사용하는 특정 공통 기능의 사용을 설정할 수 있습니다. 개체별 메모리 사용량 추적을 제공합니다. 이 정보를 적용하여 모든 메모리 누수의 원인을 찾을 수 있습니다. 메모리 누수로 이어지는 물체가 발견되면 이를 수정하거나 제거할 수 있습니다.

Conclusion

파이썬은 오늘날 사용되는 최고의 프로그래밍 언어 중 하나이다. 그러나 메모리 누수는 프로그램을 파괴하거나 느리게 만들 수 있습니다.

그러나 Python의 메모리 누수와 관련된 모든 문제를 빠르게 해결할 수 있습니다. 다른 방법들 중에서, 메모리 사용량을 추적하고 메모리 누수와 관련된 오브젝트를 제거하는 데 도움이 되는 디버깅이나 tracemalloc을 사용할 수 있다.

즐거운 코딩 되세요!

0개의 댓글