복붙노트

[PYTHON] 파이썬에서 객체에 대한 모든 참조를 찾습니다.

PYTHON

파이썬에서 객체에 대한 모든 참조를 찾습니다.

파이썬에서 객체에 대한 모든 참조를 찾는 좋은 방법은 무엇입니까?

내가 묻는 이유는 우리가 "메모리 누수"를 겪고있는 것처럼 보입니다. 웹 브라우저에서 이미지 파일을 서버로 업로드하고 있습니다. 우리가 이렇게 할 때마다 메모리 사용량은 업로드 된 파일의 크기에 비례하여 증가합니다. 이 메모리는 파이썬 가비지 콜렉션에서 결코 공개되지 않으므로 각 요청이 끝나도 삭제되거나 범위를 벗어나지 않는 이미지 데이터를 가리키는 참조가있을 것이라고 생각합니다.

파이썬에 물어볼 수있는 것이 좋을 것 같습니다 : "이 메모리를 가리키는 참조는 무엇입니까?" 그래서 가비지 수집을 유지하는 것이 무엇인지 알아낼 수 있습니다.

현재 우리는 Python과 Django를 Heroku 서버에서 실행 중입니다.

어떤 제안이나 아이디어라도 고맙게 생각합니다.

해결법

  1. ==============================

    1.Python의 표준 라이브러리에는 가비지 컬렉터 API가 포함 된 gc 모듈이 있습니다. 가능한 기능 중 하나는 다음과 같습니다.

    Python의 표준 라이브러리에는 가비지 컬렉터 API가 포함 된 gc 모듈이 있습니다. 가능한 기능 중 하나는 다음과 같습니다.

    gc.get_objects()
    

    이 함수는 현재 가비지 수집기에서 추적 한 모든 객체의 목록을 반환합니다. 다음 단계는 그것을 분석하는 것입니다.

    추적하고자하는 객체를 알고 있다면 sys 모듈의 getrefcount 함수를 사용할 수 있습니다 :

    >>> x = object()
    >>> sys.getrefcount(x)
    2
    >>> y = x
    >>> sys.getrefcount(x)
    3
    
  2. ==============================

    2.파이썬의 gc 모듈은 몇 가지 유용한 함수를 가지고 있지만, gc.get_referrers ()가 당신이 찾고있는 것처럼 들린다. 다음은 그 예입니다.

    파이썬의 gc 모듈은 몇 가지 유용한 함수를 가지고 있지만, gc.get_referrers ()가 당신이 찾고있는 것처럼 들린다. 다음은 그 예입니다.

    import gc
    
    
    def foo():
        a = [2, 4, 6]
        b = [1, 4, 7]
    
        l = [a, b]
        d = dict(a=a)
        return l, d
    
    l, d = foo()
    r1 = gc.get_referrers(l[0])
    r2 = gc.get_referrers(l[1])
    
    print r1
    print r2
    

    실행하면 다음과 같은 출력이 표시됩니다.

    [[[2, 4, 6], [1, 4, 7]], {'a': [2, 4, 6]}]
    [[[2, 4, 6], [1, 4, 7]]]
    

    첫 번째 줄은 l과 d이고, 두 번째 줄은 그냥 l이라는 것을 알 수 있습니다.

    나의 짧은 실험에서 나는 그 결과가 항상 깨끗한 것은 아님을 발견했다. 예를 들어 인턴 된 문자열과 튜플에는 예상보다 많은 리퍼러가 있습니다.

  3. from https://stackoverflow.com/questions/11891755/find-all-references-to-an-object-in-python by cc-by-sa and MIT license