[PYTHON] 파이썬에서 객체에 대한 모든 참조를 찾습니다.
PYTHON파이썬에서 객체에 대한 모든 참조를 찾습니다.
파이썬에서 객체에 대한 모든 참조를 찾는 좋은 방법은 무엇입니까?
내가 묻는 이유는 우리가 "메모리 누수"를 겪고있는 것처럼 보입니다. 웹 브라우저에서 이미지 파일을 서버로 업로드하고 있습니다. 우리가 이렇게 할 때마다 메모리 사용량은 업로드 된 파일의 크기에 비례하여 증가합니다. 이 메모리는 파이썬 가비지 콜렉션에서 결코 공개되지 않으므로 각 요청이 끝나도 삭제되거나 범위를 벗어나지 않는 이미지 데이터를 가리키는 참조가있을 것이라고 생각합니다.
파이썬에 물어볼 수있는 것이 좋을 것 같습니다 : "이 메모리를 가리키는 참조는 무엇입니까?" 그래서 가비지 수집을 유지하는 것이 무엇인지 알아낼 수 있습니다.
현재 우리는 Python과 Django를 Heroku 서버에서 실행 중입니다.
어떤 제안이나 아이디어라도 고맙게 생각합니다.
해결법
-
==============================
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.파이썬의 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이라는 것을 알 수 있습니다.
나의 짧은 실험에서 나는 그 결과가 항상 깨끗한 것은 아님을 발견했다. 예를 들어 인턴 된 문자열과 튜플에는 예상보다 많은 리퍼러가 있습니다.
from https://stackoverflow.com/questions/11891755/find-all-references-to-an-object-in-python by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] matplotlib로 numpy datetime64 플롯 (0) | 2018.11.22 |
---|---|
[PYTHON] 수레에 isdigit 사용하기? (0) | 2018.11.22 |
[PYTHON] Python Math - TypeError : 'NoneType'객체는 subscriptable이 아닙니다. (0) | 2018.11.22 |
[PYTHON] 파이썬에서 생성자와 for 루프 (0) | 2018.11.22 |
[PYTHON] pandas to_csv 출력 인용문 (0) | 2018.11.22 |