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.
- 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) و گزینهی خط فرمان-Xtracemalloc=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.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 نیز پذیرفته میشوند.
- 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).
StatisticDiff¶
- class tracemalloc.StatisticDiff¶
تفاوت آماری در تخصیصهای حافظه بین یک نمونه قدیمی و یک نمونه جدید از
Snapshot.Snapshot.compare_to()فهرستی از نمونههایStatisticDiffرا برمیگرداند. همچنین کلاسStatisticرا ببینید.- count¶
تعداد بلوکهای حافظه در تصویر لحظهای جدید (
int): اگر بلوکهای حافظه در تصویر لحظهای جدید آزاد شده باشند،0است.
- count_diff¶
تفاوت تعداد بلوکهای حافظه بین تصویر لحظهای قدیمی و تصویر لحظهای جدید (
int):0اگر بلوکهای حافظه در تصویر لحظهای جدید تخصیص دادهشده باشند.
- size¶
اندازهی کل بلوکهای حافظه بر حسب بایت در تصویر لحظهای جدید (
int):0اگر بلوکهای حافظه در تصویر لحظهای جدید آزاد شده باشند.
- size_diff¶
تفاوت اندازهی کل بلوکهای حافظه بر حسب بایت بین تصویرهای لحظهای قدیمی و جدید (
int): اگر بلوکهای حافظه در تصویر لحظهای جدید تخصیص یافته باشند،0است.
ردگیری¶
- class tracemalloc.Trace¶
ردگیری یک بلوک حافظه.
ویژگی
Snapshot.tracesیک دنباله از نمونههایTraceاست.تغییر یافته در نسخهی 3.6: ویژگی
domainاضافه شد.- domain¶
فضای آدرس یک بلوک حافظه (
int). ویژگی فقطخواندنی.tracemalloc از دامنه
0برای پیگیری تخصیصهای حافظه انجامشده توسط پایتون استفاده میکند. افزونههای C میتوانند از دامنههای دیگر برای پیگیری منابع دیگر استفاده کنند.
- size¶
اندازه بلوک حافظه بر حسب بایت (
int).
ردگیری¶
- 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())