tracemalloc으로 메모리 프로파일링
tracemalloc으로 메모리 할당을 추적하고 누수를 찾습니다.
tracemalloc으로 메모리 프로파일링은(는) CoddyKit의 무료 Python Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Python Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
tracemalloc이란 무엇인가요?
tracemalloc은 파일과 줄 번호별로 Python 메모리 할당을 추적하는 표준 라이브러리 모듈입니다.
import tracemalloc
tracemalloc.start()
x = [i for i in range(100_000)]
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Current: {current/1024:.1f} KB")
print(f"Peak: {peak/1024:.1f} KB")스냅샷 생성
스냅샷은 특정 시점의 모든 현재 할당을 캡처합니다. 두 스냅샷을 비교하면 그 사이에 할당된 항목을 찾을 수 있습니다.
import tracemalloc
tracemalloc.start()
snap1 = tracemalloc.take_snapshot()
data = [{"key": str(i)} for i in range(10_000)]
snap2 = tracemalloc.take_snapshot()
stats = snap2.compare_to(snap1, "lineno")
for stat in stats[:5]:
print(stat)스냅샷 필터링
표준 라이브러리를 제외하고 애플리케이션 코드만 표시하도록 통계를 필터링합니다.
import tracemalloc
tracemalloc.start()
leak_function()
snap = tracemalloc.take_snapshot()
filters = [tracemalloc.Filter(True, "*/myapp/*")]
stats = snap.filter_traces(filters).statistics("lineno")
for stat in stats[:10]:
print(stat)주요 메모리 할당 항목
snapshot.statistics("lineno") 또는 "traceback"을 사용하면 줄별 또는 전체 트레이스백별로 메모리를 가장 많이 사용하는 항목을 확인할 수 있습니다.
import tracemalloc
tracemalloc.start(nframe=10) # track 10 frames deep
big_list = [i**2 for i in range(500_000)]
snap = tracemalloc.take_snapshot()
for stat in snap.statistics("traceback")[:3]:
print(stat)
for line in stat.traceback.format():
print(" ", line)메모리 누수 찾기
메모리 누수가 의심되는 지점 전후에 두 스냅샷을 생성하고 비교합니다. 두 스냅샷 사이에 통계가 증가하면 누수가 발생하고 있다는 뜻입니다.
import tracemalloc
tracemalloc.start()
snap_before = tracemalloc.take_snapshot()
for _ in range(100):
suspected_leaky_function()
snap_after = tracemalloc.take_snapshot()
diff = snap_after.compare_to(snap_before, "lineno")
for stat in diff[:5]:
print(stat)get_traced_memory()
tracemalloc.get_traced_memory()는 바이트 단위의 (current, peak) 값을 반환하며, 간단한 전후 비교에 유용합니다.
import tracemalloc
tracemalloc.start()
before, _ = tracemalloc.get_traced_memory()
do_something()
after, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
print(f"Delta: {(after-before)/1024:.1f} KB, Peak: {peak/1024:.1f} KB")memory_profiler
memory_profiler는 CPU에 대한 line_profiler와 비슷하게 줄별 메모리 사용량을 제공합니다.
# pip install memory_profiler
from memory_profiler import profile
@profile
def build_data():
data = [i**2 for i in range(100_000)]
filtered = [x for x in data if x % 2 == 0]
return filtered
build_data()
# python -m memory_profiler script.pymemray
Bloomberg가 만든 memray는 플레임 그래프 출력을 지원하는 빠른 Python 메모리 프로파일러입니다.
# pip install memray
# python -m memray run script.py
# python -m memray flamegraph memray-script.py.bin
# Generates an interactive HTML flamegraph
# showing allocations by call stack메모리 사용량 줄이기
일반적인 방법으로는 리스트 대신 제너레이터 사용, __slots__ 사용, 수치 데이터에 배열 모듈 사용, NumPy 배열 사용, 클로저에서 큰 객체를 계속 살아 있게 두지 않기 등이 있습니다.
# Instead of:
data = [process(x) for x in huge_list] # all in memory
# Use a generator:
def gen_data(lst):
for x in lst:
yield process(x)
for item in gen_data(huge_list):
consume(item) # one at a timesys.getsizeof()
sys.getsizeof(obj)는 객체가 사용하는 메모리를 바이트 단위로 반환합니다. 이는 얕은 크기이므로 참조된 객체는 포함하지 않습니다.
import sys
print(sys.getsizeof([])) # 56
print(sys.getsizeof([1,2,3])) # 88
print(sys.getsizeof("hello")) # 54
print(sys.getsizeof({})) # 64
# For deep size, use recursive measurement:
def deep_size(obj):
return sys.getsizeof(obj) + sum(
sys.getsizeof(v) for v in vars(obj).values()
if hasattr(obj, "__dict__")
)운영 환경에서 프로파일링
운영 환경에서는 오버헤드를 최소화하도록 nframes를 제한하여 tracemalloc을 실행합니다. 나중에 오프라인으로 분석할 수 있도록 스냅샷을 파일에 저장합니다.
import tracemalloc, pickle
tracemalloc.start(nframe=5) # low overhead
# ... serve some requests ...
snap = tracemalloc.take_snapshot()
with open("snap.pkl","wb") as f:
pickle.dump(snap, f)
# Analyse later offline빠른 확인
tracemalloc.get_traced_memory()가 반환하는 두 값은 무엇을 나타내나요?
복습
tracemalloc.start()와 스냅샷을 함께 사용하여 메모리 누수를 찾습니다. compare_to()로 스냅샷을 비교합니다. 줄별 사용량을 확인하려면 memory_profiler를 사용하고, 플레임 그래프를 확인하려면 memray를 사용합니다. 제너레이터, __slots__, NumPy 배열로 메모리를 줄일 수 있습니다.
자주 묻는 질문
“tracemalloc으로 메모리 프로파일링” 강의는 무료인가요?
네 — “tracemalloc으로 메모리 프로파일링” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Python Academy 강의 전체를 잠금 해제할 수 있습니다. Python Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“tracemalloc으로 메모리 프로파일링”에서 뭘 배우나요?
tracemalloc으로 메모리 할당을 추적하고 누수를 찾습니다. 브라우저에서 직접 실행하는 실습 코드로 Python Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
Python Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 Python Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“tracemalloc으로 메모리 프로파일링” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 Python Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 Python Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- CPython 참조 횟수 계산
- 가비지 수집기와 순환 참조
- cProfile과 line_profiler로 프로파일링
- tracemalloc으로 메모리 프로파일링