0Pricing
Python Academy · 강의

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.py

memray

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 time

sys.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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. CPython 참조 횟수 계산
  2. 가비지 수집기와 순환 참조
  3. cProfile과 line_profiler로 프로파일링
  4. tracemalloc으로 메모리 프로파일링
← Python Academy(으)로 돌아가기