<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>نوشته های میلاد نظری</title><link>https://virgool.ir/feed/@mnrmilad</link><description>برنامه نویس. یه تنبل پرکار</description><language>fa</language><pubDate>2026-11-12 10:38:01</pubDate><image><url>https://files.virgool.ir/upload/users/308255/avatar/cWrIc2.png</url><title>میلاد نظری</title><link>https://virgool.ir/@mnrmilad</link></image><item><title>نکته مهم در export کردن، تغییرات و import کردن دیتا (ETL)</title><link>https://virgool.ir/@mnrmilad/نکته-مهم-در-export-کردن-تغییرات-و-import-کردن-دیتا-etl-yel0d79sp86a</link><description>سلام دوستان. میخوام چند نکته مهم در مورد دیتابیس بگم که حتما به کارتون میاد. داستان از جایی شروع شد که من روی یک پروژه قدیمی کار می‌کردم که استارتش از زمانی خورده بود که تازه برنامه نویسی یاد گرفته بودم. در نتیجه کد ها به شدت بد بودن، ساختار پایگاه داده افتضاح بود و برنامه دیگه قابلیت به روزرسانی نداشت. پس تصمیم گرفتم یه آپدیت کلی بکنم و همه چیز رو از اول بنویسم و بسازم.مهمترین قسمت آپدیت این برنامه تغییر توی پایگاه داده بود. همونطور که گفتم ساختار پایگاه داده افتضاح بود و حتی name convention ها رو هم رعایت نکرده بودم یک جا به صورت camelCase بود و جای دیگه snake_case بود. در نتیجه باید کل ساختار دیتا بیس رو تغییر می‌دادم. یک سری از جدول ها با هم ادغام می‌شدند و یک سری دیگه باید جدا می‌شدند. خوب توی این روند یه سری موارد رو فهمیدم که در ادامه باهاتون به اشتراک میگذارم.برای جدول ها ID بگذاریدچند روز پیش برام سوال شده بود که آیا برای جدول ها باید حتما ID بگذاریم یا نه؟ چون بعضی از جدول ها واقعا نیاز به ID ندارن مثلا جدول هایی که رابط دو جدول دیگه هستند. ولی توی این روند فهمیدم که حتما باید برای جداول ID بگذاریم که در ادامه توضیح میدم چرا.مشکل بزرگخوب بزرگترین مشکلی که من داشتم این بود که بعضی از جدول ها بیش از 10 ها ملیون رکورد داشت و خوب وقتی جدولی به این بزرگیه نمیشه با یک دستور insert into اون رو تغییر داد و ریخت توی یک جدول دیگه. باید اینجا از صف ها کمک بگیریم که خوب من چون از لاراول استفاده میکردم به کمک کوئری بویلدر و صفها در لاراول این کار رو انجام دادم. (اینجا منظورم از کوئری بویلدر ORM نیست). ولی یک مشکل بزرگ دیگه هنوز هست. و اون گرفتن هر بخش توی هر بار پردازش هست.گرفتن بخش های مختلف یک جدولخوب شاید اولین چیزی که به ذهن شما برسه مثل من استفاده از LIMIT و OFFSET باشه پس من هم همین کار رو کردم و برای مثلا LIMIT رو گذاشتم روی 1000 و OFFSET رو هم توی هر مرحله 1000 تا بیشتر می‌کردم. و جدولی که 12 ملیون رکورد داشت حدود 12 ساعت طول کشید تا انتقال پیدا کرد به جدول جدید. و حس کردم این غیر طبیعیه ولی چون تجربه نداشتم گفتم حتما طبیعیه.اما بعد از این یک اشتباه کوچیک در دستورات artisan لاراول باعث شد تمام رکورد های جدول جدید دوباره پاک بشه و اینجا بود که دوباره از اول فرایند انتقال رو انجام دادم. در این بین داشتم نگاه میکردم دیدم هرچی میگذره عملیات کند تر میشه، یعنی 1000 مرحله اوله توی کمتر از چند دقیقه انجام میشد ولی بعدش زمانش بیشتر و بیشتر میشد به صورت تساعدی. اولش فکر کردم شاید چون جدول جدید رکورد هاش بیشتر میشه عملیات INSERT کند میشه ولی بعد گفتم نکنه عملیات SELECT کند تر میشه با زیاد شدن OFFSET.بنابرین چنتا کوئری زدم و دیدم بله عملیات SELECT از جدول قدیمی با بیشتر شدن OFFSET بیشتر میشه. چنتا سرچ کردم و دیدم دقیقا رابطه مستقیم داره و وقتی OFFSET بیشتر میشه درواقع دیتابیس میاد و رکوردهای اولیه رو هم میگیره، برای همین هرچی پیش میرفت به صورت تساعدی کند می‌شد.راه حل چیه؟راه حل اینه که به جای اینکه از OFFSET و LIMIT بیایم و از ID استفاده کنیم. یعنی رکورد ها رو بر اساس ID باید ORDER کنید و بعد مثلا هر بار 1000 تا ID جدید رو بگیرید. وقتی این کار رو کردم اون عملیانی که 12 ساعت طول کشید در کمتر از یک ساعت تموم شد.نکته خیلی مهم در مورد gap بین ID هاخوب ممکنه به دلایل مختلف بین ID های شما فاصله زیادی باشه. بهترین راه برای اینکه هم زمان کمتری ازتون گرفته بشه و هم دوباره بین ID های جدید فاصله کمتر ایجاد بشه اینه که بیاین قبل از شروع هر صف این فاصله ها را حساب کنید مثلا یک سری کوئری بزنید که هر هزارتا ID رو بگیره و مقدار آخرش رو ذخیره کنه برای شروع بعدی. مثلا در نهایت همچنین آرایه‌ای داشته باشید. و توی SELECT لحاظش کنید.[&#xA;[&#34;start&#34;=&gt;0,&#34;end&#34;=&gt;12236]&#xA;[&#34;start&#34;=&gt;12236,&#34;end&#34;=&gt;25635]&#xA;[&#34;start&#34;=&gt;25635,&#34;end&#34;=&gt;35698]&#xA;.&#xA;.&#xA;.&#xA;]سخن آخرپس حتما برای جدول ها ID قرار بدید تا در این مواقع بتونید استفاده کنید. امیدوارم به دردتون بخوره و وقتتون مثل من از بین نره.</description><category>میلاد نظری</category><author>میلاد نظری</author><pubDate>Wed, 03 Nov 2021 13:28:56 +0330</pubDate></item><item><title>مشکل خطای اجرای داکر در ویندوز exit code: -1</title><link>https://virgool.ir/@mnrmilad/مشکل-خطای-اجرای-داکر-در-ویندوز-exit-code-1-wgooswvq5yri</link><description>یک روز در حال وبگردی بودم که چشمم به docker افتاد. و کلی از مزایاش خوندم پس تصمیم گرفتم نصبش کنم. بعد از نصب موقع اجرا خطا می‌داد و من هم هرچی سعی کردم نتونستم درستش کنم پس بیخیالش شدم.تا این که بعد از یک سال دوباره وسوسه شدم نصبش کنم و این بار یه کم وقت آزاد داشتم پس دست به کار شدم به امید این که دیگه به خطا بر نخورم. اما دوباره موقع اجرا با تصویر زیر مواجه شدمFailed to set version to docker-desktop: exit code: -1راستش هنوزم نفهمیدم این خطا برای چیه ولی بعد از دو شبانه روز کلنجار رفتن و عوض کردن ویندوز و 100 بار حذف و نصب دوباره داکر در نهایت در یکی گزارش های خطا گیت هاب دیدم یک نفر نوشته من WSL یا همون گزینه Windows Subsystem for Linux رو از قسمت Turn Windows features on or off غیر فعال کردم و درست شد. پس من هم همین کارو کردم و بعد از ریستارت کردن کامپیوتر و اجرای دوباره داکر با عکس های زیر مواجه شدم.و بعد در کمال نا باوری دیدم که داکر راه افتاد. اما شما لازم نیست wsl رو کلا غیر فعال کنید در ادامه یک روش ساده تر بهتون میگم. پس برگشتم عقب و بررسی کردم حتی دوباره wsl رو نصب کردم و حتی مطمئن شدم که ورژن دو wsl رو فعال کردم امار هر کاری کردم بازم با wsl درست نشد اما یه سری نکته فهمیدم که باهاتون به اشتراک میگذارم.راه حل مشکل اجرا نشدن داکر در ویندوزدرواقع داکر به صورت پیشفرض اول تنظیم شده که با wsl فعال بشه نه با hyper-v و طبق نوشته های خودش که توی عکس های بالا گفته شده در صورتی که با wsl اجرا بشه کارایی و پرفورمنس بهتری داره که خوب من هر کاری کردم نشد. اگر دلیلشو فهمیدم حتما به اشتراک میزارم براتون.در نهایت وقتی شما به این مشکل بر خوردید و موقع اجرا با خطا مواجه شدید لازم نیست wsl رو غیر فعال کنید. راه حل خیلی ساده تری داره که در ادامه با عکس توضیح میدمهمانند عکس بالا روی آیکون قرمز رنگ داکر راست کلیک کنید و تنظیمات رو بزنید تا صفحه زیر براتون باز بشههمانند عکس بالا گزینه use the WSL 2 based engine رو غیر فعال کنید و گزینه apply &amp; restart رو بزنیددر نهایت بعد از مراحل بالا داکر به راحتی اجرا میشه و میتونید کار باهاش رو شروع کنیدامیدوارم مفید بوده باشه و مثل من چند روز درگیرش نشید.</description><category>میلاد نظری</category><author>میلاد نظری</author><pubDate>Sun, 18 Oct 2020 17:47:04 +0330</pubDate></item></channel></rss>