tracemalloc --- ردگیری تخصیص‌های حافظه

اضافه شده در نسخه‌ی 3.4.

کد منبع: Lib/tracemalloc.py


ماژول tracemalloc یک ابزار اشکال‌زدایی برای ردگیری بلوک‌های حافظه‌ی تخصیص‌یافته توسط پایتون است. این ماژول اطلاعات زیر را فراهم می‌کند:

  • ردگیری پشته محل تخصیص یک شیء

  • آمار بلوک‌های حافظه تخصیص‌یافته به تفکیک نام پرونده و شماره خط: اندازه کل، تعداد و میانگین اندازه بلوک‌های حافظه تخصیص‌یافته

  • محاسبه تفاوت‌های بین دو تصویر لحظه‌ای برای تشخیص نشت حافظه

برای ردگیری بیشتر بلوک‌های حافظه‌ی تخصیص‌یافته توسط پایتون، این ماژول باید هرچه زودتر با تنظیم متغیر محیطی PYTHONTRACEMALLOC روی 1، یا با استفاده از گزینه‌ی خط فرمان -X tracemalloc راه‌اندازی شود. تابع tracemalloc.start() را می‌توان در ران‌تایم فراخوانی کرد تا ردگیری تخصیص‌های حافظه‌ی پایتون آغاز شود.

به‌طور پیش‌فرض، ردگیری یک بلوک حافظه‌ی تخصیص‌یافته فقط جدیدترین فریم (۱ فریم) را ذخیره می‌کند. برای ذخیره‌ی ۲۵ فریم در زمان راه‌اندازی: متغیر محیطی PYTHONTRACEMALLOC را روی 25 تنظیم کنید، یا از گزینه‌ی خط فرمان -X tracemalloc=25 استفاده کنید.

مثال‌ها

نمایش ۱۰ مورد برتر

نمایش ۱۰ پرونده‌ای که بیشترین حافظه را تخصیص می‌دهند:

import tracemalloc

tracemalloc.start()

# ... run your application ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('lineno')

print("[ Top 10 ]")
for stat in top_stats[:10]:
    print(stat)

نمونه‌ای از خروجی بدنه‌ی آزمون پایتون:

[ Top 10 ]
<frozen importlib._bootstrap>:716: size=4855 KiB, count=39328, average=126 B
<frozen importlib._bootstrap>:284: size=521 KiB, count=3199, average=167 B
/usr/lib/python3.4/collections/__init__.py:368: size=244 KiB, count=2315, average=108 B
/usr/lib/python3.4/unittest/case.py:381: size=185 KiB, count=779, average=243 B
/usr/lib/python3.4/unittest/case.py:402: size=154 KiB, count=378, average=416 B
/usr/lib/python3.4/abc.py:133: size=88.7 KiB, count=347, average=262 B
<frozen importlib._bootstrap>:1446: size=70.4 KiB, count=911, average=79 B
<frozen importlib._bootstrap>:1454: size=52.0 KiB, count=25, average=2131 B
<string>:5: size=49.7 KiB, count=148, average=344 B
/usr/lib/python3.4/sysconfig.py:411: size=48.0 KiB, count=1, average=48.0 KiB

می‌توانیم ببینیم که پایتون 4855 KiB داده (بایت‌کد و ثابت‌ها) را از ماژول‌ها بارگذاری کرده و ماژول collections مقدار 244 KiB را برای ساخت انواع namedtuple تخصیص داده است.

برای گزینه‌های بیشتر، Snapshot.statistics() را ببینید.

محاسبه تفاوت‌ها

دو تصویر لحظه‌ای بگیرید و تفاوت‌ها را نمایش دهید:

import tracemalloc
tracemalloc.start()
# ... start your application ...

snapshot1 = tracemalloc.take_snapshot()
# ... call the function leaking memory ...
snapshot2 = tracemalloc.take_snapshot()

top_stats = snapshot2.compare_to(snapshot1, 'lineno')

print("[ Top 10 differences ]")
for stat in top_stats[:10]:
    print(stat)

نمونه‌ای از خروجی پیش از/پس از اجرای برخی از آزمون‌های بدنه‌ی آزمون پایتون:

[ Top 10 differences ]
<frozen importlib._bootstrap>:716: size=8173 KiB (+4428 KiB), count=71332 (+39369), average=117 B
/usr/lib/python3.4/linecache.py:127: size=940 KiB (+940 KiB), count=8106 (+8106), average=119 B
/usr/lib/python3.4/unittest/case.py:571: size=298 KiB (+298 KiB), count=589 (+589), average=519 B
<frozen importlib._bootstrap>:284: size=1005 KiB (+166 KiB), count=7423 (+1526), average=139 B
/usr/lib/python3.4/mimetypes.py:217: size=112 KiB (+112 KiB), count=1334 (+1334), average=86 B
/usr/lib/python3.4/http/server.py:848: size=96.0 KiB (+96.0 KiB), count=1 (+1), average=96.0 KiB
/usr/lib/python3.4/inspect.py:1465: size=83.5 KiB (+83.5 KiB), count=109 (+109), average=784 B
/usr/lib/python3.4/unittest/mock.py:491: size=77.7 KiB (+77.7 KiB), count=143 (+143), average=557 B
/usr/lib/python3.4/urllib/parse.py:476: size=71.8 KiB (+71.8 KiB), count=969 (+969), average=76 B
/usr/lib/python3.4/contextlib.py:38: size=67.2 KiB (+67.2 KiB), count=126 (+126), average=546 B

می‌توانیم ببینیم که پایتون 8173 KiB از داده‌های ماژول (بایت‌کد و ثابت‌ها) را بارگذاری کرده است، و این مقدار 4428 KiB بیشتر از مقداری است که پیش از آزمون‌ها، هنگامی که تصویر لحظه‌ای قبلی گرفته شده بود، بارگذاری شده بود. به همین ترتیب، ماژول linecache، 940 KiB از کد منبع پایتون را برای قالب‌بندی ردگیری‌های پشته در نهانگاه ذخیره کرده است، که تمام آن از زمان گرفتن تصویر لحظه‌ای قبلی بوده است.

اگر سیستم حافظه آزاد کمی دارد، می‌توان تصویرهای لحظه‌ای را با استفاده از متد Snapshot.dump() روی دیسک نوشت تا تصویر لحظه‌ای به‌صورت آفلاین تحلیل شود. سپس از متد Snapshot.load() برای بارگذاری مجدد تصویر لحظه‌ای استفاده کنید.

دریافت ردگیری یک بلوک حافظه

کد برای نمایش ردگیری پشته‌ی بزرگ‌ترین بلوک حافظه:

import tracemalloc

# Store 25 frames
tracemalloc.start(25)

# ... run your application ...

snapshot = tracemalloc.take_snapshot()
top_stats = snapshot.statistics('traceback')

# pick the biggest memory block
stat = top_stats[0]
print("%s memory blocks: %.1f KiB" % (stat.count, stat.size / 1024))
for line in stat.traceback.format():
    print(line)

مثالی از خروجی بدنه‌ی آزمون پایتون (ردگیری پشته محدود به ۲۵ فریم):

903 memory blocks: 870.1 KiB
  File "<frozen importlib._bootstrap>", line 716
  File "<frozen importlib._bootstrap>", line 1036
  File "<frozen importlib._bootstrap>", line 934
  File "<frozen importlib._bootstrap>", line 1068
  File "<frozen importlib._bootstrap>", line 619
  File "<frozen importlib._bootstrap>", line 1581
  File "<frozen importlib._bootstrap>", line 1614
  File "/usr/lib/python3.4/doctest.py", line 101
    import pdb
  File "<frozen importlib._bootstrap>", line 284
  File "<frozen importlib._bootstrap>", line 938
  File "<frozen importlib._bootstrap>", line 1068
  File "<frozen importlib._bootstrap>", line 619
  File "<frozen importlib._bootstrap>", line 1581
  File "<frozen importlib._bootstrap>", line 1614
  File "/usr/lib/python3.4/test/support/__init__.py", line 1728
    import doctest
  File "/usr/lib/python3.4/test/test_pickletools.py", line 21
    support.run_doctest(pickletools)
  File "/usr/lib/python3.4/test/regrtest.py", line 1276
    test_runner()
  File "/usr/lib/python3.4/test/regrtest.py", line 976
    display_failure=not verbose)
  File "/usr/lib/python3.4/test/regrtest.py", line 761
    match_tests=ns.match_tests)
  File "/usr/lib/python3.4/test/regrtest.py", line 1563
    main()
  File "/usr/lib/python3.4/test/__main__.py", line 3
    regrtest.main_in_temp_cwd()
  File "/usr/lib/python3.4/runpy.py", line 73
    exec(code, run_globals)
  File "/usr/lib/python3.4/runpy.py", line 160
    "__main__", fname, loader, pkg_name)

می‌توانیم ببینیم که بیشترین حافظه در ماژول importlib برای بارگذاری داده‌ها (بایت‌کد و ثابت‌ها) از ماژول‌ها تخصیص داده شده است: 870.1 KiB. ردگیری پشته نشان می‌دهد که importlib آخرین بار داده‌ها را کجا بارگذاری کرده است: در خط import pdb از ماژول doctest. اگر ماژول جدیدی بارگذاری شود، ردگیری پشته ممکن است تغییر کند.

بالای زیبا

کدی برای نمایش ۱۰ سطری که بیشترین حافظه را تخصیص می‌دهند، با خروجی زیبا و با نادیده گرفتن پرونده‌های <frozen importlib._bootstrap> و <unknown>:

import linecache
import os
import tracemalloc

def display_top(snapshot, key_type='lineno', limit=10):
    snapshot = snapshot.filter_traces((
        tracemalloc.Filter(False, "<frozen importlib._bootstrap>"),
        tracemalloc.Filter(False, "<unknown>"),
    ))
    top_stats = snapshot.statistics(key_type)

    print("Top %s lines" % limit)
    for index, stat in enumerate(top_stats[:limit], 1):
        frame = stat.traceback[0]
        print("#%s: %s:%s: %.1f KiB"
              % (index, frame.filename, frame.lineno, stat.size / 1024))
        line = linecache.getline(frame.filename, frame.lineno).strip()
        if line:
            print('    %s' % line)

    other = top_stats[limit:]
    if other:
        size = sum(stat.size for stat in other)
        print("%s other: %.1f KiB" % (len(other), size / 1024))
    total = sum(stat.size for stat in top_stats)
    print("Total allocated size: %.1f KiB" % (total / 1024))

tracemalloc.start()

# ... run your application ...

snapshot = tracemalloc.take_snapshot()
display_top(snapshot)

نمونه‌ای از خروجی بدنه‌ی آزمون پایتون:

Top 10 lines
#1: Lib/base64.py:414: 419.8 KiB
    _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
#2: Lib/base64.py:306: 419.8 KiB
    _a85chars2 = [(a + b) for a in _a85chars for b in _a85chars]
#3: collections/__init__.py:368: 293.6 KiB
    exec(class_definition, namespace)
#4: Lib/abc.py:133: 115.2 KiB
    cls = super().__new__(mcls, name, bases, namespace)
#5: unittest/case.py:574: 103.1 KiB
    testMethod()
#6: Lib/linecache.py:127: 95.4 KiB
    lines = fp.readlines()
#7: urllib/parse.py:476: 71.8 KiB
    for a in _hexdig for b in _hexdig}
#8: <string>:5: 62.0 KiB
#9: Lib/_weakrefset.py:37: 60.0 KiB
    self.data = set()
#10: Lib/base64.py:142: 59.8 KiB
    _b32tab2 = [a + b for a in _b32tab for b in _b32tab]
6220 other: 3602.8 KiB
Total allocated size: 5303.1 KiB

برای گزینه‌های بیشتر، Snapshot.statistics() را ببینید.

ثبت اندازه‌ی فعلی و اندازه‌ی اوج تمام بلوک‌های حافظه‌ی ردگیری‌شده

کد زیر دو مجموع مانند 0 + 1 + 2 + ... را به‌صورت ناکارآمد، با ایجاد فهرستی از آن اعداد محاسبه می‌کند. این فهرست به‌طور موقت حافظه‌ی زیادی مصرف می‌کند. می‌توانیم از get_traced_memory() و reset_peak() برای مشاهده‌ی مصرف کم حافظه پس از محاسبه‌ی مجموع و همچنین اوج مصرف حافظه در طول محاسبات استفاده کنیم:

import tracemalloc

tracemalloc.start()

# Example code: compute a sum with a large temporary list
large_sum = sum(list(range(100000)))

first_size, first_peak = tracemalloc.get_traced_memory()

tracemalloc.reset_peak()

# Example code: compute a sum with a small temporary list
small_sum = sum(list(range(1000)))

second_size, second_peak = tracemalloc.get_traced_memory()

print(f"{first_size=}, {first_peak=}")
print(f"{second_size=}, {second_peak=}")

خروجی:

first_size=664, first_peak=3592984
second_size=804, second_peak=29704

استفاده از reset_peak() تضمین کرد که بتوانیم اوج را در طول محاسبه‌ی small_sum به‌دقت ثبت کنیم، هرچند این اوج بسیار کوچک‌تر از اندازه‌ی اوج کلی بلوک‌های حافظه از زمان فراخوانی start() است. بدون فراخوانی reset_peak()، second_peak همچنان اوج حاصل از محاسبه‌ی large_sum باقی می‌ماند (یعنی برابر با first_peak). در این حالت، هر دو اوج بسیار بالاتر از مصرف نهایی حافظه هستند و این نشان می‌دهد که می‌توانیم بهینه‌سازی کنیم (با حذف فراخوانی غیرضروری list و نوشتن sum(range(...))).

API

توابع

tracemalloc.clear_traces()

پاک کردن ردگیری‌های بلوک‌های حافظه‌ی تخصیص‌یافته توسط پایتون.

همچنین stop() را ببینید.

tracemalloc.get_object_traceback(obj)

ردگیری پشته‌ای را که شیء پایتون obj در آن تخصیص داده شده است، بگیرید. یک نمونه Traceback برمی‌گرداند، یا اگر ماژول tracemalloc تخصیص‌های حافظه را ردگیری نمی‌کند یا تخصیص آن شیء را ردگیری نکرده است، None برمی‌گرداند.

همچنین توابع gc.get_referrers() و sys.getsizeof() را مشاهده کنید.

tracemalloc.get_traceback_limit()

حداکثر تعداد فریم‌های ذخیره‌شده در ردگیری پشته‌ی یک ردگیری را دریافت کنید.

برای به دست آوردن محدودیت، ماژول tracemalloc باید تخصیص‌های حافظه را ردگیری کند، در غیر این صورت یک استثنا پرتاب می‌شود.

این محدودیت توسط تابع start() تنظیم می‌شود.

tracemalloc.get_traced_memory()

اندازه‌ی فعلی و اندازه‌ی اوج بلوک‌های حافظه‌ی ردگیری‌شده توسط ماژول tracemalloc را به‌صورت یک تاپل دریافت کنید: (current: int, peak: int).

tracemalloc.reset_peak()

اندازه‌ی اوج بلوک‌های حافظه‌ی ردگیری‌شده توسط ماژول tracemalloc را روی اندازه‌ی فعلی تنظیم می‌کند.

اگر ماژول tracemalloc در حال ردگیری تخصیص‌های حافظه نیست، کاری انجام نشود.

این تابع فقط اندازه اوج ثبت‌شده را تغییر می‌دهد و برخلاف clear_traces()، هیچ ردپایی را تغییر نمی‌دهد یا پاک نمی‌کند. تصاویر لحظه‌ای گرفته‌شده با take_snapshot() پیش از فراخوانی reset_peak() را می‌توان به‌طور معناداری با تصاویر لحظه‌ای گرفته‌شده پس از فراخوانی مقایسه کرد.

همچنین get_traced_memory() را ببینید.

اضافه شده در نسخه‌ی 3.9.

tracemalloc.get_tracemalloc_memory()

میزان مصرف حافظه‌ی ماژول tracemalloc را بر حسب بایت دریافت کنید؛ این ماژول برای ذخیره‌ی ردگیری‌های بلوک‌های حافظه استفاده می‌شود. یک int برمی‌گرداند.

tracemalloc.is_tracing()

True اگر ماژول tracemalloc در حال ردگیری تخصیص‌های حافظه پایتون باشد، در غیر این صورت False.

همچنین توابع start() و stop() را ببینید.

tracemalloc.start(nframe: int = 1)

آغاز ردگیری تخصیص‌های حافظه پایتون: نصب قلاب‌ها بر تخصیص‌دهنده‌های حافظه پایتون. ردگیری‌های پشته جمع‌آوری‌شده برای ردگیری‌ها به nframe فریم محدود خواهند شد. به‌طور پیش‌فرض، یک ردگیری از یک بلوک حافظه تنها جدیدترین فریم را ذخیره می‌کند: محدودیت 1 است. nframe باید بزرگ‌تر یا مساوی 1 باشد.

همچنان می‌توانید با مشاهده‌ی ویژگی Traceback.total_nframe، تعداد اصلی کل فریم‌های تشکیل‌دهنده‌ی ردگیری پشته را بخوانید.

ذخیره‌سازی بیش از 1 فریم فقط برای محاسبه آمار گروه‌بندی‌شده بر اساس 'traceback' یا محاسبه آمار تجمعی مفید است: متدهای Snapshot.compare_to() و Snapshot.statistics() را ببینید.

ذخیره‌سازی فریم‌های بیشتر، سربار حافظه و CPU ماژول tracemalloc را افزایش می‌دهد. برای اندازه‌گیری میزان حافظه مصرفی ماژول tracemalloc، از تابع get_tracemalloc_memory() استفاده کنید.

می‌توان از متغیر محیطی PYTHONTRACEMALLOC (PYTHONTRACEMALLOC=NFRAME) و گزینه‌ی خط فرمان -X tracemalloc=NFRAME برای شروع ردگیری در هنگام راه‌اندازی استفاده کرد.

همچنین توابع stop()، is_tracing() و get_traceback_limit() را ببینید.

tracemalloc.stop()

توقف ردگیری تخصیص‌های حافظه‌ی پایتون: حذف قلاب‌ها (hooks) از تخصیص‌دهنده‌های حافظه‌ی پایتون. همچنین تمام ردپاهای جمع‌آوری‌شده‌ی پیشین از بلوک‌های حافظه‌ی تخصیص‌یافته توسط پایتون را پاک می‌کند.

برای گرفتن یک تصویر لحظه‌ای از ردگیری‌ها پیش از پاک کردن آن‌ها، تابع take_snapshot() را فراخوانی کنید.

همچنین توابع start()، is_tracing() و clear_traces() را ببینید.

tracemalloc.take_snapshot()

یک تصویر لحظه‌ای از ردگیری‌های بلوک‌های حافظه‌ی تخصیص‌یافته توسط پایتون بگیرید. یک نمونه‌ی جدید از Snapshot برگردانید.

تصویر لحظه‌ای شامل بلوک‌های حافظه‌ای نمی‌شود که پیش از شروع ردگیری تخصیص‌های حافظه توسط ماژول tracemalloc تخصیص داده شده‌اند.

ردگیری‌های پشته‌ی ردگیری‌ها به get_traceback_limit() فریم محدود هستند. برای ذخیره‌ی فریم‌های بیشتر، از پارامتر nframe تابع start() استفاده کنید.

برای گرفتن یک تصویر لحظه‌ای، ماژول tracemalloc باید تخصیص‌های حافظه را ردگیری کند؛ تابع start() را ببینید.

همچنین تابع get_object_traceback() را ببینید.

DomainFilter

class tracemalloc.DomainFilter(inclusive: bool, domain: int)

ردگیری‌های بلوک‌های حافظه را بر اساس فضای آدرس (دامنه) آن‌ها فیلتر کنید.

اضافه شده در نسخه‌ی 3.6.

inclusive

اگر inclusive برابر True باشد (شامل کردن)، با بلوک‌های حافظه تخصیص‌یافته در دامنه‌ی فضای نشانی domain مطابقت می‌کند.

اگر inclusive برابر False باشد (حذف)، با بلوک‌های حافظه‌ای که در دامنه‌ی فضای آدرس domain تخصیص داده نشده‌اند مطابقت دارد.

domain

فضای آدرس یک بلوک حافظه (int). ویژگی فقط‌خواندنی.

فیلتر

class tracemalloc.Filter(inclusive: bool, filename_pattern: str, lineno: int = None, all_frames: bool = False, domain: int = None)

فیلتر بر اساس ردگیری‌های بلوک‌های حافظه.

برای سینتکس filename_pattern، تابع fnmatch.fnmatch() را ببینید. پسوند پرونده '.pyc' با '.py' جایگزین می‌شود.

مثال‌ها:

  • Filter(True, subprocess.__file__) فقط ردگیری‌های ماژول subprocess را شامل می‌شود

  • Filter(False, tracemalloc.__file__) ردگیری‌های ماژول tracemalloc را حذف می‌کند

  • Filter(False, "<unknown>") ردگیری‌های خالی را حذف می‌کند

تغییر یافته در نسخه‌ی 3.5: پسوند پرونده '.pyo' دیگر با '.py' جایگزین نمی‌شود.

تغییر یافته در نسخه‌ی 3.6: ویژگی domain اضافه شد.

domain

فضای آدرس یک بلوک حافظه (int یا None).

tracemalloc از دامنه 0 برای پیگیری تخصیص‌های حافظه انجام‌شده توسط پایتون استفاده می‌کند. افزونه‌های C می‌توانند از دامنه‌های دیگر برای پیگیری منابع دیگر استفاده کنند.

inclusive

اگر inclusive برابر True باشد (شامل)، فقط با بلوک‌های حافظه‌ای که در پرونده‌ای با نام مطابق filename_pattern در خط شماره‌ی lineno تخصیص یافته‌اند مطابقت دارد.

اگر inclusive برابر False باشد (مستثنی کردن)، بلوک‌های حافظه‌ی تخصیص‌یافته در خط شماره‌ی lineno در پرونده‌ای با نامی مطابق filename_pattern نادیده گرفته می‌شوند.

lineno

شماره خط (int) فیلتر. اگر lineno برابر None باشد، فیلتر با هر شماره سطری مطابقت دارد.

filename_pattern

الگوی نام فایلِ فیلتر (str). ویژگی فقط‌خواندنی.

all_frames

اگر all_frames برابر True باشد، تمام فریم‌های ردگیری پشته بررسی می‌شوند. اگر all_frames برابر False باشد، فقط جدیدترین فریم بررسی می‌شود.

این ویژگی در صورتی که حد ردگیری 1 باشد، هیچ تأثیری ندارد. تابع get_traceback_limit() و ویژگی Snapshot.traceback_limit را ببینید.

فریم

class tracemalloc.Frame

فریم یک ردگیری.

کلاس Traceback دنباله‌ای از نمونه‌های Frame است.

filename

نام پرونده (str).

lineno

شماره خط (int).

تصویر لحظه‌ای

class tracemalloc.Snapshot

تصویر لحظه‌ای از ردگیری‌های بلوک‌های حافظه تخصیص‌یافته توسط پایتون.

تابع take_snapshot() یک نمونه‌ی تصویر لحظه‌ای ایجاد می‌کند.

compare_to(old_snapshot: Snapshot, key_type: str, cumulative: bool = False)

تفاوت‌ها را با یک تصویر لحظه‌ای قدیمی محاسبه کنید. آمار را به‌صورت فهرستی مرتب‌شده از نمونه‌های StatisticDiff دریافت کنید که بر اساس key_type گروه‌بندی شده‌اند.

برای پارامترهای key_type و cumulative، متد Snapshot.statistics() را ببینید.

نتیجه بر اساس: مقدار مطلق StatisticDiff.size_diff، StatisticDiff.size، مقدار مطلق StatisticDiff.count_diff، Statistic.count و سپس بر اساس StatisticDiff.traceback، از بزرگ‌ترین به کوچک‌ترین مرتب می‌شود.

dump(filename)

تصویر لحظه‌ای را در یک پرونده بنویسید.

برای بارگذاری مجدد تصویر لحظه‌ای از load() استفاده کنید.

filter_traces(filters)

یک نمونه جدید از Snapshot با دنباله‌ای فیلترشده از traces ایجاد کنید؛ filters فهرستی از نمونه‌های DomainFilter و Filter است. اگر filters فهرستی خالی باشد، یک نمونه جدید از Snapshot با یک کپی از ردگیری‌ها برگردانید.

همه‌ی فیلترهای فراگیر یک‌جا اعمال می‌شوند؛ اگر هیچ فیلتر فراگیری با یک ردگیری مطابقت نداشته باشد، آن ردگیری نادیده گرفته می‌شود. اگر دست‌کم یک فیلتر استثناکننده با یک ردگیری مطابقت داشته باشد، آن ردگیری نادیده گرفته می‌شود.

تغییر یافته در نسخه‌ی 3.6: نمونه‌های DomainFilter اکنون در filters نیز پذیرفته می‌شوند.

classmethod load(filename)

بارگذاری یک تصویر لحظه‌ای از یک پرونده.

همچنین dump() را ببینید.

statistics(key_type: str, cumulative: bool = False)

دریافت آمار به‌صورت یک فهرست مرتب‌شده از نمونه‌های Statistic که بر اساس key_type گروه‌بندی شده‌اند:

key_type

توضیح

'filename'

نام پرونده

'lineno'

نام پرونده و شماره‌ی خط

'traceback'

traceback

اگر cumulative برابر True باشد، اندازه و تعداد بلوک‌های حافظه را برای تمام فریم‌های ردگیری پشته‌ی یک ردگیری تجمیع می‌کند، نه فقط برای جدیدترین فریم. حالت تجمیعی فقط در صورتی قابل استفاده است که key_type برابر با 'filename' یا 'lineno' باشد.

نتیجه از بزرگ‌ترین به کوچک‌ترین بر اساس Statistic.size، Statistic.count و سپس Statistic.traceback مرتب می‌شود.

traceback_limit

حداکثر تعداد فریم‌های ذخیره‌شده در ردگیری پشته‌ی traces: نتیجه‌ی get_traceback_limit() در زمان گرفتن تصویر لحظه‌ای.

traces

ردپاهای تمام بلوک‌های حافظه‌ی تخصیص‌داده‌شده توسط پایتون: دنباله‌ای از نمونه‌های Trace.

این دنباله ترتیب تعریف‌نشده‌ای دارد. برای دریافت فهرستی مرتب‌شده از آمارها، از متد Snapshot.statistics() استفاده کنید.

آماره

class tracemalloc.Statistic

آمار تخصیص‌های حافظه.

Snapshot.statistics() فهرستی از نمونه‌های Statistic را برمی‌گرداند.

همچنین کلاس StatisticDiff را ببینید.

count

تعداد بلوک‌های حافظه (int).

size

اندازه‌ی کل بلوک‌های حافظه بر حسب بایت (int).

traceback

ردگیری پشته‌ای که بلوک حافظه در آن تخصیص داده شده است، نمونه‌ای از Traceback.

StatisticDiff

class tracemalloc.StatisticDiff

تفاوت آماری در تخصیص‌های حافظه بین یک نمونه قدیمی و یک نمونه جدید از Snapshot.

Snapshot.compare_to() فهرستی از نمونه‌های StatisticDiff را برمی‌گرداند. همچنین کلاس Statistic را ببینید.

count

تعداد بلوک‌های حافظه در تصویر لحظه‌ای جدید (int): اگر بلوک‌های حافظه در تصویر لحظه‌ای جدید آزاد شده باشند، 0 است.

count_diff

تفاوت تعداد بلوک‌های حافظه بین تصویر لحظه‌ای قدیمی و تصویر لحظه‌ای جدید (int): 0 اگر بلوک‌های حافظه در تصویر لحظه‌ای جدید تخصیص داده‌شده باشند.

size

اندازه‌ی کل بلوک‌های حافظه بر حسب بایت در تصویر لحظه‌ای جدید (int): 0 اگر بلوک‌های حافظه در تصویر لحظه‌ای جدید آزاد شده باشند.

size_diff

تفاوت اندازه‌ی کل بلوک‌های حافظه بر حسب بایت بین تصویرهای لحظه‌ای قدیمی و جدید (int): اگر بلوک‌های حافظه در تصویر لحظه‌ای جدید تخصیص یافته باشند، 0 است.

traceback

ردگیری پشته‌ای که بلوک‌های حافظه در آن تخصیص داده شده‌اند، نمونه‌ای از Traceback.

ردگیری

class tracemalloc.Trace

ردگیری یک بلوک حافظه.

ویژگی Snapshot.traces یک دنباله از نمونه‌های Trace است.

تغییر یافته در نسخه‌ی 3.6: ویژگی domain اضافه شد.

domain

فضای آدرس یک بلوک حافظه (int). ویژگی فقط‌خواندنی.

tracemalloc از دامنه 0 برای پیگیری تخصیص‌های حافظه انجام‌شده توسط پایتون استفاده می‌کند. افزونه‌های C می‌توانند از دامنه‌های دیگر برای پیگیری منابع دیگر استفاده کنند.

size

اندازه بلوک حافظه بر حسب بایت (int).

traceback

ردگیری پشته‌ای که بلوک حافظه در آن تخصیص داده شده است، نمونه‌ای از Traceback.

ردگیری

class tracemalloc.Traceback

دنباله‌ای از نمونه‌های Frame مرتب‌شده از قدیمی‌ترین فریم تا جدیدترین فریم.

یک ردگیری پشته حداقل شامل 1 فریم است. اگر ماژول tracemalloc در دریافت فریمی ناموفق بود، از نام پرونده "<unknown>" در خط شماره 0 استفاده می‌شود.

هنگامی که یک تصویر لحظه‌ای گرفته می‌شود، ردگیری‌های پشته‌ی ردگیری‌ها به get_traceback_limit() فریممحدود می‌شوند. تابع take_snapshot() را ببینید. تعداد اصلی فریم‌های ردگیری پشته در ویژگی Traceback.total_nframe ذخیره می‌شود. این به شما امکان می‌دهد که بدانید آیا یک ردگیری پشته به‌دلیل محدودیت ردگیری پشته بریده شده است یا خیر.

ویژگی Trace.traceback یک نمونه از Traceback است.

تغییر یافته در نسخه‌ی 3.7: فریم‌ها اکنون از قدیمی‌ترین به جدیدترین مرتب می‌شوند، نه از جدیدترین به قدیمی‌ترین.

total_nframe

تعداد کل فریم‌هایی که پیش از کوتاه‌سازی، ردگیری پشته را تشکیل داده‌اند. اگر اطلاعات در دسترس نباشد، این ویژگی می‌تواند روی None تنظیم شود.

تغییر یافته در نسخه‌ی 3.9: ویژگی Traceback.total_nframe افزوده شد.

format(limit=None, most_recent_first=False)

ردگیری پشته را به‌صورت فهرستی از سطرهای قالب‌بندی می‌کند. برای بازیابی سطرها از کد منبع، از ماژول linecache استفاده می‌کند. اگر limit تنظیم شده باشد، در صورت مثبت بودن limit، جدیدترین فریم‌ها را به تعداد limit قالب‌بندی می‌کند. در غیر این صورت، قدیمی‌ترین فریم‌ها را به تعداد abs(limit) قالب‌بندی می‌کند. اگر most_recent_first برابر True باشد، ترتیب فریم‌های قالب‌بندی‌شده معکوس می‌شود و جدیدترین فریم به‌جای آخر، اول برگردانده می‌شود.

مشابه تابع traceback.format_tb()، با این تفاوت که format() شامل نویسه‌های خط جدید نمی‌شود.

مثال:

print("Traceback (most recent call first):")
for line in traceback:
    print(line)

خروجی:

Traceback (most recent call first):
  File "test.py", line 9
    obj = Object()
  File "test.py", line 12
    tb = tracemalloc.get_object_traceback(f())