GeezerVison is showing python.github.io — tracemalloc --- ردگیری تخصیصهای حافظه
tracemalloc --- ردگیری تخصیصهای حافظه¶
کد منبع: 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() را ببینید.
-
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)¶
ردگیریهای بلوکهای حافظه را بر اساس فضای آدرس (دامنه) آنها فیلتر کنید.
-
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 تنظیم شود.
-
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())
© حق نشر 2001 Python Software Foundation.
این صفحه تحت مجوز بنیاد نرمافزار پایتون نسخه ۲ منتشر شده است.
مثالها، دستورالعملها، و سایر کدهای موجود در مستندات همچنین تحت مجوز بدون بند BSD منتشر شدهاند.
برای اطلاعات بیشتر به تاریخچه و مجوز مراجعه کنید.
بنیاد نرمافزار پایتون یک شرکت غیرانتفاعی است.
لطفاً کمک مالی کنید.
آخرین بهروزرسانی در نوامبر 12, 2026 (06:19 UTC).
آیا اشکالی یافتید؟
ساخته شده با Sphinx 9.1.0.
|