تحليل الذاكرة باستخدام tracemalloc
تتبّع تخصيصات الذاكرة واعثر على التسريبات باستخدام tracemalloc
تحليل الذاكرة باستخدام tracemalloc درس مجاني في Python Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في 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 قياس استخدام الذاكرة سطرًا بسطر، على غرار 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
memray (من Bloomberg) محلّل سريع لذاكرة 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__، ووحدة array للبيانات الرقمية، ومصفوفات 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__")
)تحليل الأداء في بيئة الإنتاج
شغّل tracemalloc باستخدام قيمة nframes محدودة في بيئة الإنتاج لتقليل النفقات الإضافية. خزّن اللقطات في ملف لتحليلها دون اتصال.
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) وفتح باقي دورة Python Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Python Academy 4 دروس في المجموع.
ماذا ستتعلم في «تحليل الذاكرة باستخدام tracemalloc»؟
تتبّع تخصيصات الذاكرة واعثر على التسريبات باستخدام tracemalloc تتمرن على Python Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Python Academy؟
لا تُشترط خبرة سابقة. Python Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «تحليل الذاكرة باستخدام tracemalloc»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Python Academy هذا؟
نعم. كل درس في Python Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- عدّ المراجع في CPython
- جامع البيانات المهملة والمراجع الدورية
- تحليل الأداء باستخدام cProfile وline_profiler
- تحليل الذاكرة باستخدام tracemalloc