برنامه نویسی

ساختن حافظه نهان LRU با موضوعات موجود در پایتون – از مفهوم تا کد

یادداشت های نویسنده:
من یک متخصص نیستم – فقط یک توسعه دهنده است که سعی می کند با انجام آن بیاموزد. طی چند ماه گذشته ، من پایتون ، DSA ، طراحی سیستم و AWS را دست و پنجه نرم کرده ام و چیزی را فهمیدم: تا زمانی که به یک دیوار اصابت کردم و آن را برطرف کردم ، واقعاً چیزی نمی فهمم. اینگونه است که من با شکستن ، اشکال زدایی و بازسازی یاد می گیرم. این مقاله بخشی از مجموعه ای از یادداشت ها است که من برای آینده خود و هر کس دیگری که مانند من یاد می گیرد منتشر می کنم: از طریق موانع جاده ای ، مشکلات دست و پا و کنجکاوی.
سلب مسئولیت:
این پست نشان دهنده تجربه و آزمایش شخصی من در هنگام یادگیری است. کد اصلی است مگر اینکه در غیر این صورت بیان شده باشد. آزمایش مورد لبه هنوز در حال انجام است و در صورت تغییر ، کد را به روز می کند. این مقاله با کمک ابزارهای AI برای گرامر و بررسی طلسم نوشته شده است.
انگیزه:
برای یک سیستم ردیابی وب سایت ، که من به عنوان یک پروژه سرگرمی در حال ساختن آن هستم ، جایی که می توانیم وب سایت های بازدید شده و زمان صرف شده برای هر یک را ردیابی کنیم ، برای بازیابی داده های مربوط به وب سایت ها باید از حافظه نهان استفاده کنم. به جای جستجوی مکرر این داده ها ، می توانیم از حافظه نهان LRU (حداقل اخیراً استفاده شده) برای ذخیره و به روزرسانی تعداد بازدید به طور کارآمد استفاده کنیم ، باعث کاهش سربار و بهبود عملکرد می شویم. این شبیه سازی نشان دهنده یک مشکل طراحی سیستم در دنیای واقعی است-مدیریت حافظه محدود ضمن اطمینان از پاسخگویی در یک برنامه کاربر متمرکز.
مباحث تحت پوشش: پایتون ، نخ ، حافظه نهان (LRU) ، DLL ، هاشمپ
حافظه پنهان چیست؟
حافظه نهان یک سیستم ذخیره موقت است که داده ها را بر اساس قوانین خاص ذخیره می کند. استراتژی های مختلف حافظه پنهان بسته به نیازهای کاربردی یا طراحی محصول وجود دارد. این مقاله به استراتژی حافظه پنهان LRU (حداقل اخیراً استفاده شده) می پردازد ، جایی که کمترین داده های اخیراً دسترسی پیدا می کنند وقتی حافظه نهان به حد ظرفیت خود رسید.
چگونه می توان یک حافظه پنهان LRU ساخت؟
حافظه نهان LRU کارآمد با استفاده از ترکیبی از یک لیست مضاعف مرتبط (DLL) و یک هاشماپ (فرهنگ لغت) با پیچیدگی زمانی O (1) برای بازیابی و علاوه بر این قابل اجرا است.
یک فرهنگ لغت که در آن هر کلید به یک گره حاوی مقدار مورد نیاز اشاره می کند. سه مورد اصلی عملیات حافظه پنهان را انجام می دهند:
کلید در حافظه پنهان وجود ندارد: اگر حافظه نهان دارای فضا است ، مورد را اضافه کنید
کلید در حافظه پنهان وجود دارد: گره قبلی را برداشته و در انتها یک گره جدید اضافه کنید
حافظه پنهان کامل است: قبل از اضافه کردن داده های جدید ، کمترین مورد اخیراً مورد استفاده (رئیس DLL) را حذف کنید

چرا سفارش داده نمی شود؟
سفارش Python می تواند LRU را پیاده سازی کند ، اما ساختن آن به صورت دستی به شما کمک می کند:
درک کنید که چگونه نقشه ها و نشانگرها با هم کار می کنند.
تنگناهای عملکرد اشکال زدایی.

ابتدا یک DLL را با افزودن و حذف روش هایی که در آن یک گره جدید اضافه می کنیم و یک گره معین را حذف می کنیم ، بسازید.
دوم ، یک حافظه پنهان ایجاد کنید که یک فرهنگ لغت بتواند فقط 4 مقادیر یعنی محدوده حافظه نهان را ذخیره کند ، و اگر از آن فراتر رود ، از اول DLL برداشته شود و اگر دوباره به آن دسترسی پیدا کرد ، آن را از DLL جدا کنید و دوباره آن را به شروع DLL اضافه کنید. DLL برای حفظ نظم استفاده می شود ، در حالی که فرهنگ لغت به حفظ جفت های ارزش کلیدی کمک می کند و به بازیابی O (1) کمک می کند.
اکنون همه چیز باید خوب باشد ، اما من 100 ذخیره URL Dummy را آزمایش کردم که تقریباً در همان زمان طول کشید ، بنابراین هیچ استفاده عملی از حافظه پنهان زیرا فقط می تواند 4 URL و اطلاعات آنها را ذخیره کند ، روند کار را کند کرد. برای پرداختن به این عملکرد ، من از موضوعات استفاده کردم.
من در آنجا به یک زن و شوهر از جاده های جاده ای برخورد کردم ، فرض کردم که از زمان پایتون از گیل استفاده می کند ، نیازی به مراقبت از اجرای نخ همزمان ندارم ، که به نوبه خود منجر به ذخیره متناقض می شود. تأثیر این بود که زمان بیشتری می برد ، و گاهی اوقات ارزش های جدید را نمی گرفتم ، و گرچه URL در حافظه پنهان بود ، اما نتوانستم به حافظه پنهان ضربه بزنم.
بنابراین من کمی بیشتر کاوش کردم و یاد گرفتم که باید از قفل نخ استفاده کنم ، اگرچه گیل تضمین می کند که فقط یک موضوع به طور همزمان با استفاده از Python Bytecode را اجرا می کند ، اما این موضوع را از عملیات های مشترک در داده های مشترک متوقف نمی کند. بدون قفل ، موضوعات نشانگرهای DLL را فاسد می کنند یا داده های قدیمی را برمی گردانند. قفل های نخ در اینجا کمک کردند ، سرانجام Lrucache با MultitHreading معنا پیدا کرد ، و در زیر نسخه نهایی کد است:

رمز

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا