<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های Ali Zarean</title>
        <link>https://virgool.io/feed/@aliezarean</link>
        <description>خنیاگر غمگین</description>
        <language>fa</language>
        <pubDate>2026-06-16 07:48:16</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/567440/avatar/XiIenY.jpg?height=120&amp;width=120</url>
            <title>Ali Zarean</title>
            <link>https://virgool.io/@aliezarean</link>
        </image>

                    <item>
                <title>گراف دیتابیس و Neo4j</title>
                <link>https://virgool.io/@aliezarean/%DA%AF%D8%B1%D8%A7%D9%81-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-%D9%88-neo4j-dvduwqfcer7b</link>
                <description>گراف دیتابیس چیست؟گراف دیتابیس‌ها نوعی از سیستم‌های مدیریت پایگاه داده هستند که داده‌ها را بر اساس مدل گراف سازماندهی می‌کنند. در این مدل، داده‌ها به صورت نودها (nodes)، روابط (relationships) و ویژگی‌ها (properties) ذخیره می‌شوند. نودها می‌توانند نمایانگر موجودیت‌هایی مانند افراد، اشیاء یا مفاهیم باشند، در حالی که روابط، پیوندهای میان این نودها را توصیف می‌کنند. برای نمونه، در یک شبکه اجتماعی، یک نود می‌تواند یک کاربر را نشان دهد و رابطه‌ای مانند &quot;دوست&quot; میان دو نود برقرار شود. این رویکرد بر پایه نظریه گراف‌ها استوار است و برای مدل‌سازی داده‌های پیچیده و دارای ارتباطات گسترده، بسیار مناسب است.تفاوت گراف دیتابیس با رابطه‌ای دیتابیسدر مقایسه با پایگاه‌های داده رابطه‌ای (RDBMS) مانند MySQL یا PostgreSQL، گراف دیتابیس‌ها تفاوت‌های اساسی دارند. در RDBMS، داده‌ها در جداول ذخیره می‌شوند و روابط از طریق کلیدهای خارجی (foreign keys) و عملیات جوین (joins) مدیریت می‌گردند. این روش برای داده‌های ساخت‌یافته و تراکنش‌های روزمره کارآمد است، اما در مواجهه با روابط پیچیده، عملیات جوین می‌تواند زمان‌بر و پیچیده شود. برای مثال، جستجوی دوستانِ دوستان در یک شبکه اجتماعی ممکن است نیازمند چندین جوین باشد که عملکرد سیستم را کاهش دهد.مزایای گراف دیتابیس‌ها نسبت به RDBMS شامل سرعت بالاتر در پیمایش روابط است، زیرا روابط به طور مستقیم ذخیره می‌شوند و نیازی به محاسبات جوین در زمان اجرا نیست. این ویژگی برای کوئری‌های مبتنی بر روابط، مانند سیستم‌های توصیه‌گر یا تحلیل شبکه، بسیار مفید است. علاوه بر این، گراف دیتابیس‌ها انعطاف‌پذیری بیشتری دارند و اغلب بدون نیاز به schema ثابت عمل می‌کنند، به طوری که می‌توان نودها و روابط جدیدی را بدون تغییر ساختار کلی اضافه کرد. با این حال، این دیتابیس‌ها ممکن است در تراکنش‌های حجیم یا داده‌های ساده کمتر کارآمد باشند و نیازمند مدیریت دقیق برای جلوگیری از پیچیدگی بیش از حد هستند.چند کوئری نمونهMATCH (a:Person)-[:FRIEND]-&gt;(b:Person)WHERE a.name = &#039;Alice&#039;RETURN b.nameاین کوئری کوتاه‌ترین مسیر (با هر نوع رابطه‌ای) میان Alice و David را پیدا می‌کند. نتیجه می‌تواند یک مسیر مانند Alice -&gt; Bob -&gt; David باشد. این قابلیت برای تحلیل شبکه‌های اجتماعی یا مسیرهای ارتباطی مفید است و زمان اجرای آن بهینه است.CREATE (a:Person {name: &#039;Eve&#039;})MERGE (b:Person {name: &#039;Alice&#039;})CREATE (a)-[:FRIEND]-&gt;(b)RETURN a, bاین کوئری یک نود جدید به نام Eve ایجاد می‌کند، نود Alice را (اگر وجود نداشته باشد) می‌سازد و رابطه FRIEND میان آن‌ها برقرار می‌کند. نتیجه بازگشت نودهای ایجادشده است. این نمونه نشان‌دهنده انعطاف‌پذیری Cypher در عملیات نوشتاری است.پیاده‌سازیدر سطح پیاده‌سازی داخلی، Neo4j پیمایش گراف را با استفاده از اشاره‌گرها در رکوردهای نود و رابطه مدیریت می‌کند. هر نود شامل شناسه (ID)، لیبل‌ها، ویژگی‌ها و اشاره‌گرهایی به روابط ورودی و خروجی است. روابط نیز رکوردهای جداگانه‌ای دارند که شامل ID، نوع رابطه، ویژگی‌ها و اشاره‌گرهایی به نودهای شروع و پایان هستند. برای پیمایش، Neo4j از ساختار زنجیره‌ای (مانند لیست پیوندی) استفاده می‌کند: هر رکورد رابطه اشاره‌گرهایی به رابطه بعدی در زنجیره روابط یک نود دارد. هنگام اجرای کوئری پیمایشی، موتور Neo4j از این اشاره‌گرها برای حرکت مستقیم میان نودها و روابط بهره می‌برد، بدون نیاز به اسکن کل پایگاه داده. این روش که به index-free adjacency معروف است، دلیل اصلی سرعت بالای Neo4j در عمق‌های بالا محسوب می‌شود. برای مثال، در پیمایش دوستانِ دوستانِ دوستان، سیستم تنها اشاره‌گرها را دنبال می‌کند و زمان هر گام O(1) است، نه O(n) مانند جوین‌ها در RDBMS.موارد استفادهموارد استفاده از گراف دیتابیس‌ها و به ویژه Neo4j بسیار گسترده است. در شبکه‌های اجتماعی، برای تحلیل روابط و توصیه دوستان به کار می‌رود. در سیستم‌های توصیه‌گر مانند نتفلیکس یا آمازون، گراف‌ها روابط میان کاربران و محصولات را مدل‌سازی می‌کنند تا پیشنهادهای دقیق‌تری ارائه دهند. در حوزه امنیت، برای تشخیص تقلب در تراکنش‌های بانکی از طریق تحلیل الگوهای روابط مفید است. همچنین، در زیست‌شناسی برای مدل‌سازی شبکه‌های ژنتیکی، در مدیریت دانش برای گراف‌های دانش (مانند آنچه در گوگل استفاده می‌شود) و در صنایع مالی، بهداشت و مخابرات برای تحلیل شبکه‌های پیچیده کاربرد دارد.مقیاس‌پذیریNeo4j برای مقیاس‌پذیری، از مقیاس‌پذیری افقی (sharding) و عمودی پشتیبانی می‌کند. در حالت کلاستر، داده‌ها میان نودها توزیع می‌شوند و replication برای خواندن‌های موازی استفاده می‌گردد. با این حال، عملیات نوشتاری معمولاً روی یک لیدر انجام می‌شود تا consistency حفظ شود. برای گراف‌های بسیار بزرگ، ویژگی‌هایی مانند fabric برای کوئری روی چندین پایگاه داده به کار می‌رود. محدودیت‌هایی وجود دارد: گراف‌های تریلیونی ممکن است نیازمند سخت‌افزار قدرتمند و بهینه‌سازی باشند، و مقیاس‌پذیری ورک‌لودهای سنگین می‌تواند چالش‌برانگیز باشد. در مجموع، Neo4j برای گراف‌های متوسط تا بزرگ مناسب است، اما برای مقیاس‌های عظیم مانند فیسبوک، ممکن است نیاز به سفارشی‌سازی داشته باشد.</description>
                <category>Ali Zarean</category>
                <author>Ali Zarean</author>
                <pubDate>Sun, 09 Nov 2025 16:03:53 +0330</pubDate>
            </item>
                    <item>
                <title>ReadySet انقلابی در کش کردن پاسخ دیتابیس</title>
                <link>https://virgool.io/sobhan-tech/readyset-%D8%A7%D9%86%D9%82%D9%84%D8%A7%D8%A8%DB%8C-%D8%AF%D8%B1-%DA%A9%D8%B4-%DA%A9%D8%B1%D8%AF%D9%86-%D9%BE%D8%A7%D8%B3%D8%AE-%D8%AF%DB%8C%D8%AA%D8%A7%D8%A8%DB%8C%D8%B3-zysuglnnnu7d</link>
                <description>سرعت صد برابر بدون تغییر کدمقدمهدر دنیای دیجیتال که سرعت و پاسخگویی حرف اول را می‌زند، عملکرد برنامه‌های بک‌اند نقشی حیاتی در جلب رضایت کاربران ایفا می‌کند. پایگاه داده، به‌عنوان قلب تپنده بسیاری از این برنامه‌ها، اغلب به دلیل حجم بالای پرس‌وجوها یا پیچیدگی آن‌ها به گلوگاه عملکرد تبدیل می‌شود. تأخیر در پاسخگویی به پرس‌وجوها می‌تواند تجربه کاربری را مختل کند، فروش را کاهش دهد یا حتی مشکلات عملیاتی جدی ایجاد کند. برای مثال، در یک پلتفرم تجارت الکترونیک، جستجوی کند محصولات می‌تواند مشتریان را ناامید کند، یا در برنامه‌های رسانه‌های اجتماعی، بارگذاری کند فیدها باعث کاهش تعامل کاربران می‌شود.برای رفع این مشکلات، توسعه‌دهندگان به روش‌های سنتی مانند کشینگ دستی، استفاده از replicaهای خواندنی و بهینه‌سازی پرس‌وجوها روی آورده‌اند. اما این روش‌ها اغلب پیچیده، زمان‌بر و با محدودیت‌های مقیاس‌پذیری همراه هستند. در این میان، ReadySet به‌عنوان یک موتور کشینگ SQL نوآورانه وارد صحنه شده است که می‌تواند عملکرد پایگاه‌های داده MySQL و PostgreSQL را تا 100 برابر بهبود بخشد، بدون نیاز به تغییر کد برنامه یا ساختار پایگاه داده.در این مقاله، ابتدا تأثیر سرعت پایگاه داده بر برنامه‌های بک‌اند را بررسی می‌کنیم، سپس روش‌های قدیمی بهبود عملکرد را مرور می‌کنیم، ReadySet و مزایای آن را معرفی می‌کنیم، نحوه عملکرد آن و استفاده از گراف داده‌ای را توضیح می‌دهیم و در نهایت آن را با روش‌های مشابه از نظر مقیاس‌پذیری، سرعت و سهولت پیاده‌سازی مقایسه می‌کنیم.تأثیر سرعت پایگاه داده بر برنامه‌های بک‌اندپایگاه داده یکی از اجزای اصلی برنامه‌های بک‌اند است که وظیفه ذخیره، بازیابی و به‌روزرسانی داده‌ها را بر عهده دارد. سرعت پاسخگویی پایگاه داده مستقیماً بر عملکرد کلی برنامه تأثیر می‌گذارد. وقتی یک کاربر درخواستی مانند بارگذاری یک صفحه وب، جستجوی محصول یا ارسال فرم را انجام می‌دهد، برنامه باید پرس‌وجوهایی را به پایگاه داده ارسال کند. اگر این پرس‌وجوها کند باشند، تأخیر در پاسخگویی ایجاد می‌شود که می‌تواند تجربه کاربری را به شدت تحت تأثیر قرار دهد.به عنوان مثال:در یک برنامه تجارت الکترونیک، جستجوی کند محصولات می‌تواند باعث تأخیر در بارگذاری صفحه شود و مشتریان را از خرید منصرف کند.در پلتفرم‌های رسانه‌های اجتماعی، فیدهای کند می‌توانند کاربران را از تعامل با برنامه بازدارند.در برنامه‌های مالی، تأخیر در پردازش تراکنش‌ها می‌تواند منجر به از دست دادن فرصت‌ها یا مشکلات انطباق با مقررات شود.با افزایش تعداد کاربران و حجم داده‌ها، بار روی پایگاه داده افزایش می‌یابد و مشکلات عملکردی تشدید می‌شوند. مقیاس‌پذیری پایگاه داده برای مدیریت این بار اضافی معمولاً نیازمند افزودن سخت‌افزارهای گران‌قیمت یا بهینه‌سازی پیچیده پرس‌وجوهاست که هر دو زمان‌بر و پرهزینه هستند.روش‌های قدیمی برای بهبود عملکرد پایگاه دادهبرای مقابله با چالش‌های عملکرد پایگاه داده، توسعه‌دهندگان از روش‌های مختلفی استفاده کرده‌اند که هر کدام مزایا و معایب خاص خود را دارند:1. کشینگ دستیکشینگ دستی شامل ذخیره داده‌های پراستفاده در یک سیستم سریع مانند Redis یا Memcached است تا تعداد پرس‌وجوهای ارسالی به پایگاه داده کاهش یابد. این روش می‌تواند عملکرد را بهبود بخشد، اما مدیریت invalidation کش—یعنی به‌روزرسانی داده‌های کش شده هنگام تغییر داده‌های اصلی—پیچیده و مستعد خطاست. توسعه‌دهندگان باید منطق سفارشی برای مدیریت کش بنویسند که می‌تواند منجر به ناسازگاری داده‌ها یا اشکالات برنامه‌نویسی شود.2. Replicaهای خواندنیبسیاری از پایگاه‌های داده از replicaهای خواندنی پشتیبانی می‌کنند که کپی‌هایی از پایگاه داده اصلی هستند و پرس‌وجوهای خواندنی را مدیریت می‌کنند. این روش بار خواندنی را از پایگاه داده اصلی تخلیه می‌کند و عملکرد را بهبود می‌بخشد. با این حال، replicaهای خواندنی ممکن است با تأخیر replication مواجه شوند، که منجر به مشکلات consistency eventual می‌شود، یعنی داده‌های روی replica ممکن است به‌روز نباشند. علاوه بر این، راه‌اندازی و نگهداری replicaها نیازمند زیرساخت اضافی و مدیریت پیچیده است.3. بهینه‌سازی پرس‌وجوبهینه‌سازی پرس‌وجوهای SQL و ایندکس‌های پایگاه داده می‌تواند عملکرد را به‌طور قابل توجهی بهبود بخشد. این فرآیند شامل تجزیه و تحلیل برنامه‌های اجرای پرس‌وجو، افزودن ایندکس‌های مناسب و گاهی بازنویسی پرس‌وجوهاست. اگرچه این روش مؤثر است، اما نیاز به دانش عمیق از ساختار پایگاه داده دارد و با افزایش حجم داده‌ها یا تغییر الگوهای پرس‌وجو، نیاز به بهینه‌سازی مداوم دارد.این روش‌ها، هرچند مفید، اغلب با پیچیدگی‌های پیاده‌سازی، هزینه‌های زیرساختی بالا و چالش‌های حفظ consistency داده‌ها همراه هستند.معرفی ReadySetReadySet یک موتور کشینگ SQL است که به‌عنوان یک لایه شفاف بین برنامه و پایگاه داده‌های MySQL یا PostgreSQL عمل می‌کند. این ابزار با کش کردن نتایج پرس‌وجوهای select و به‌روزرسانی تدریجی آن‌ها با تغییر داده‌های اصلی، عملکرد را به‌طور چشمگیری بهبود می‌بخشد. برخلاف روش‌های سنتی، ReadySet نیازی به تغییر کد برنامه یا schema پایگاه داده ندارد و می‌تواند با تغییر یک connection string ساده در برنامه ادغام شود.ویژگی‌های کلیدی ReadySet عبارتند از:سازگاری Wire: سازگار با پروتکل‌های MySQL و PostgreSQL، که امکان ادغام آسان را فراهم می‌کند.مدیریت خودکار کش: به‌طور خودکار invalidation و به‌روزرسانی کش را مدیریت می‌کند، و نیاز به منطق سفارشی را از بین می‌برد.مقیاس‌پذیری افقی: می‌تواند برای مدیریت ترافیک خواندنی افزایش یافته مقیاس‌پذیر شود.به‌روزرسانی‌های بی‌درنگ: داده‌های کش شده را با استفاده از replication stream پایگاه داده به‌روز نگه می‌دارد.بدون نیاز به تغییر کد: توسعه‌دهندگان می‌توانند بدون تغییر برنامه‌های موجود از ReadySet استفاده کنند.ReadySet بر اساس تحقیقات Jon Gjengset در پایان‌نامه دکتری او در MIT با عنوان &quot;Partial State in Dataflow-Based Materialized Views&quot; توسعه یافته است و از یک رویکرد مبتنی بر گراف داده‌ای برای مدیریت کارآمد داده‌ها استفاده می‌کند.نحوه عملکرد ReadySet و نگهداری داده‌ها به‌صورت گرافReadySet از یک گراف داده‌ای (dataflow graph) برای مدیریت و نگهداری نتایج پرس‌وجوها به‌صورت materialized views استفاده می‌کند. این گراف، وابستگی‌های محاسباتی پرس‌وجوهای SQL را نشان می‌دهد، جایی که:گره‌ها (vertices): نشان‌دهنده عملیات‌های محاسباتی مانند تجمیع (aggregation) یا اتصال (join) هستند.لبه‌ها (edges): وابستگی‌های داده‌ای بین این عملیات‌ها را نشان می‌دهند.فرآیند کارکش کردن پرس‌وجوها: وقتی یک پرس‌وجو اجرا می‌شود، ReadySet بررسی می‌کند که آیا نتیجه در materialized view موجود است یا خیر. اگر موجود باشد، نتیجه به‌سرعت از کش برگردانده می‌شود. در غیر این صورت، نتیجه به‌صورت درخواستی محاسبه و در کش ذخیره می‌شود.به‌روزرسانی‌های تدریجی: ReadySet به replication stream پایگاه داده گوش می‌دهد. وقتی داده‌های اصلی تغییر می‌کنند (مثلاً افزودن یک رأی به جدول Votes)، این تغییر به‌عنوان یک به‌روزرسانی به گراف داده‌ای تزریق می‌شود. گره‌های مربوطه در گراف به‌روزرسانی‌های لازم را انجام می‌دهند و نتایج جدید را به گره‌های فرزند منتقل می‌کنند.حالت جزئی (Partial State): برخلاف materialized views سنتی که تمام داده‌ها را ذخیره می‌کنند، ReadySet از حالت جزئی پشتیبانی می‌کند. این یعنی فقط داده‌های پراستفاده در حافظه نگه داشته می‌شوند. اگر داده‌ای در کش موجود نباشد، ReadySet از upqueries استفاده می‌کند که به‌صورت معکوس در گراف داده‌ای حرکت می‌کنند تا داده‌های مورد نیاز را از جداول پایه یا سایر materialized views بازیابی کنند.نگهداری گراف داده‌ای: گراف داده‌ای به ReadySet امکان می‌دهد تا به‌روزرسانی‌ها را به‌صورت تدریجی و کارآمد انجام دهد. برای مثال، اگر یک رأی جدید به یک داستان اضافه شود، ReadySet فقط تعداد آرای مربوط به آن داستان را افزایش می‌دهد، به جای بازسازی کل materialized view.این رویکرد مبتنی بر گراف داده‌ای، همراه با حالت جزئی و upqueries، به ReadySet امکان می‌دهد تا حافظه را بهینه استفاده کند و عملکرد را برای پرس‌وجوهای پیچیده بهبود بخشد.مثال عملیفرض کنید یک برنامه وب دارای جداول Stories و Votes است و یک پرس‌وجو برای شمارش تعداد آرای هر داستان اجرا می‌شود. ReadySet یک گراف داده‌ای ایجاد می‌کند که شامل گره‌هایی برای جدول پایه Votes، عملیات تجمیع (شمارش آراء) و یک گره خواننده (reader node) برای ذخیره نتایج است. وقتی یک رأی جدید اضافه می‌شود، ReadySet فقط تعداد آرای داستان مربوطه را به‌روزرسانی می‌کند، که این فرآیند بسیار سریع‌تر از محاسبه مجدد کل پرس‌وجوست.مزایای ReadySetReadySet مزایای متعددی نسبت به روش‌های سنتی ارائه می‌دهد:سهولت ادغام: با سازگاری با پروتکل‌های MySQL و PostgreSQL، ReadySet می‌تواند با تغییر یک connection string ادغام شود، بدون نیاز به تغییر کد برنامه.افزایش عملکرد: آزمایش‌ها نشان می‌دهند که ReadySet می‌تواند عملکرد پرس‌وجوها را تا 100 برابر بهبود بخشد، با کاهش زمان پاسخگویی از 250-1500 میلی‌ثانیه به 15-150 میلی‌ثانیه یا حتی کمتر از یک میلی‌ثانیه برای پرس‌وجوهای کش شده.صرفه‌جویی در هزینه: با تخلیه بار خواندنی از پایگاه داده اصلی، ReadySet امکان کاهش اندازه instanceهای پایگاه داده یا تعداد replicaهای خواندنی را فراهم می‌کند، که می‌تواند تا 70٪ در هزینه‌های زیرساختی صرفه‌جویی کند.مقیاس‌پذیری: ReadySet می‌تواند به‌صورت افقی مقیاس‌پذیر شود تا ترافیک خواندنی بالا را مدیریت کند، و عملکرد را با رشد برنامه حفظ می‌کند.Consistency بی‌درنگ: برخلاف replicaهای خواندنی که ممکن است با تأخیر replication مواجه شوند، ReadySet داده‌های کش شده را با استفاده از replication stream به‌روز نگه می‌دارد.بهره‌وری توسعه‌دهنده: با حذف نیاز به منطق کشینگ سفارشی یا بهینه‌سازی دستی پرس‌وجوها، ReadySet به توسعه‌دهندگان اجازه می‌دهد تا روی توسعه ویژگی‌های جدید تمرکز کنند.مقایسه ReadySet با روش‌های مشابهدر مقابل کشینگ دستیکشینگ دستی با ابزارهایی مانند Redis یا Memcached می‌تواند عملکرد بالایی ارائه دهد، اما نیاز به نوشتن کدهای پیچیده برای مدیریت invalidation و به‌روزرسانی کش دارد. این فرآیند مستعد خطاست و می‌تواند منجر به ناسازگاری داده‌ها شود. ReadySet این پیچیدگی را با مدیریت خودکار کش حذف می‌کند و عملکرد مشابه یا بهتری را با تلاش کمتر ارائه می‌دهد.در مقابل Replicaهای خواندنیReplicaهای خواندنی بار خواندنی را از پایگاه داده اصلی تخلیه می‌کنند، اما تأخیر replication می‌تواند باعث ناسازگاری داده‌ها شود. همچنین، راه‌اندازی و نگهداری replicaها نیازمند زیرساخت اضافی و مدیریت پیچیده است. ReadySet بدون تأخیر replication، داده‌ها را به‌روز نگه می‌دارد و با یک تغییر ساده در connection string قابل ادغام است.در مقابل سایر راه‌حل‌های کشینگسایر راه‌حل‌های کشینگ ممکن است نیاز به تغییرات در کد برنامه یا الگوهای پرس‌وجوی خاص داشته باشند. ReadySet با شفافیت کامل و سازگاری با پرس‌وجوهای SQL موجود، پیاده‌سازی را ساده‌تر می‌کند. همچنین، به‌روزرسانی‌های خودکار آن نیاز به تنظیمات TTL یا invalidation دستی را از بین می‌برد.نتیجه‌گیریدر جستجوی عملکرد بهینه برای برنامه‌های بک‌اند، سرعت پایگاه داده یک عامل کلیدی است. روش‌های سنتی مانند کشینگ دستی، replicaهای خواندنی و بهینه‌سازی پرس‌وجوها، اگرچه مفید هستند، اما با چالش‌هایی مانند پیچیدگی پیاده‌سازی، ناسازگاری داده‌ها و هزینه‌های بالای زیرساختی همراه‌اند.ReadySet با ارائه یک موتور کشینگ SQL شفاف و کارآمد، این مشکلات را برطرف می‌کند. این ابزار با استفاده از یک گراف داده‌ای و مدیریت حالت جزئی، نتایج پرس‌وجوها را به‌صورت تدریجی به‌روزرسانی می‌کند و عملکردی تا 100 برابر بهتر، صرفه‌جویی در هزینه‌ها و سهولت پیاده‌سازی را ارائه می‌دهد. برای سازمان‌هایی که به دنبال بهبود عملکرد پایگاه داده و کاهش هزینه‌ها هستند، ReadySet یک راه‌حل ایده‌آل است.برای کسب اطلاعات بیشتر، به وبسایت ReadySet مراجعه کنید یا مخزن GitHub آن‌ را بررسی کنید.منابعوبسایت رسمی ReadySetمخزن GitHub ReadySetپایان‌نامه دکتری Jon Gjengsetمقاله TechCrunch در مورد ReadySet</description>
                <category>Ali Zarean</category>
                <author>Ali Zarean</author>
                <pubDate>Sun, 27 Jul 2025 16:38:30 +0330</pubDate>
            </item>
                    <item>
                <title>معرفی Qdrant</title>
                <link>https://virgool.io/sobhan-tech/%D9%85%D8%B9%D8%B1%D9%81%DB%8C-qdrant-ebub5uukprwh</link>
                <description>وکتور دیتابیس‌ها با ظهور تکنیک‌های RAG (Retrieval-Augmented Generation) محبوبیت دوچندانی پیدا کرده‌اند. ولی استفاده از آنها فقط به این زمینه محدود نمی‌شود. رشد بسیار زیاد هوش مصنوعی در سال‌های اخیر منجر به تولید بردارهای بسیار مطلوب از روی داده‌های مختلف مانند متن، تصویر و… شده که می‌توان برای جستجو بین تصاویر مشابه یا متون مشابه از آنها استفاده کرد. برای ذخیره‌ی این بردارها و جستجو بین آنها، دیتابیس‌های مختلفی توسعه داده شدند که در حال حاضر یکی از محبوب‌ترین‌ها، دیتابیس «کوادرانت» می‌باشد.چرا به وکتورها نیاز داریم؟اکثر داده‌های دیجیتال قابل نمایش با یک بردار می‌باشند. وکتورها می‌توانند معنادارتر از داده‌ی خام باشند. برای مثال، یک تصویر خام با تعداد زیادی عدد ذخیره می‌شود که هیچ‌کدام از این اعداد نشان‌دهنده‌ی معنا و مفهوم خاصی از تصویر، مانند حضور یا عدم حضور افراد در آن یا شاد یا غمگین بودن عکس، نیستند (در فرمت‌هایی که با ویوفرم کار می‌کنند، ضرایب ویوفرم هستند و در فرمت‌هایی که با پیکسل‌ها کار می‌کنند، شدت رنگ‌های مختلف هستند). برای یافتن یک تصویر مشابه، نمی‌توان مقدار عددی تک‌تک پیکسل‌ها را یک به یک مقایسه کرد و بر اساس آن گفت که دو تصویر چقدر مشابهند. اما در صورتی که از هر تصویر یک بردار استخراج شود که هر عضو آن معنا و مفهومی از تصویر دارا باشد، می‌توان مقایسه‌ی بسیار دقیقی بر اساس بردار‌ها انجام داد.شبکه‌های عصبی می‌توانند از روی داده‌های مختلف بردارهایی استخراج کنند که در فضای آن بردارها، داده‌های مشابه در نزدیکی یکدیگر قرار گیرند و داده‌های متفاوت از هم فاصله‌ی بیشتری داشته باشند.در این مثال، داده‌های مختلف به بردارهای ۳۰۰ بعدی تبدیل شده‌اند و در یک شمای سه‌بعدی، موارد مشابه مانند حیوانات به هم نزدیک و از موارد نامشابه مانند میوه‌ها دور هستنداین مثال نشان می‌دهد که یک شبکه‌ی عصبی داده‌ها را به شکل مطلوبی در فضای بردار نهایی تبدیل می‌کندوکتور دیتابیس‌ها چه می‌کنند؟اصلی‌ترین وظیفه‌ی وکتور دیتابیس‌ها، ذخیره‌ی بردارها و جستجوی نزدیک‌ترین بردار با دریافت یک بردار می‌باشد.این دیتابیس‌ها می‌توانند بردارهایی با ابعاد بسیار بزرگ را مدیریت کنند.برخی از آنها علاوه بر این، قابلیت‌هایی مانند فشرده‌سازی بردارها و فراداده (metadata) همراه بردارها را نیز دارند.وکتور دیتابیس‌ها چگونه کار می‌کنند؟این دیتابیس‌ها برای جستجوی سریع بین بردارها و یافتن نزدیک‌ترین بردار، از روش‌های خاصی برای ایندکس کردن داده استفاده می‌کنند که از جمله‌ی آنها می‌توان به سه روش زیر اشاره کرد:FAISS (Facebook AI Similarity Search): یک کتابخانه‌ی توسعه‌داده‌شده توسط فیسبوک برای جستجوی مبتنی بر شباهت.Hierarchical Navigable Small World (HNSW): یک روش بر اساس ساخت گراف برای جستجوی ANN (Approximate Nearest Neighbor).Product Quantization (PQ): یک روش برای کاهش تعداد بیت‌هایی که به ذخیره‌سازی هر اندیس در بردارها اختصاص داده می‌شود. این روش سرعت را افزایش داده و حافظه‌ی مصرفی را کاهش می‌دهد.کوادرانت چیست؟کوادرانت یک وکتور دیتابیس کارآمد و متن‌باز است.یک سامانه‌ی کاریابی می‌تواند اطلاعات شغل‌های مختلف را به بردار تبدیل کرده و در کوادرانت ذخیره کند. سپس از هر شخص اطلاعاتی را بگیرد و بر اساس آن یک بردار ساخته و نزدیک‌ترین شغل به آن شخص را با جستجو در کوادرانت پیدا کندکوادرانت در دنیای دیتابیس‌ها کجا قرار می‌گیرد؟مقایسه بین کوادرانت و چند دیتابیس مشهور دیگرایندکسینگ در کوادرانتدر کوادرانت از روش Hierarchical Navigable Small World (HNSW) استفاده شده است. در این روش ایندکسینگ، از روی بردارها یک گراف ساخته می‌شود که چندین لایه دارد. در هر لایه، بردارهای نزدیک به یکدیگر متصل می‌شوند.نحوه‌ی ساخت گرافهر برداری که به گراف اضافه می‌شود، ابتدا در پایین‌ترین لایه قرار می‌گیرد و به بردارهایی که کمترین فاصله را با آن دارند، متصل می‌شود. سپس با احتمال کمتری، این بردار به لایه‌های بالاتر نیز اضافه می‌شود. این فرآیند تا لایه‌ی آخر ادامه می‌یابد. در نهایت، یک گراف چندلایه ایجاد می‌شود که در آن در لایه‌ی بالایی تعداد بسیار کمی بردار وجود دارد، در لایه‌ی پایینی تمام بردارها حضور دارند، و در لایه‌های میانی تعداد بردارها از پایین به بالا کاهش می‌یابد.نحوه‌ی جستجوبرای یافتن نزدیک‌ترین بردار به یک بردار دلخواه، جستجو از یک بردار در لایه‌ی بالایی گراف شروع می‌شود. بین بردارهای متصل به آن، نزدیک‌ترین بردار به بردار مورد جستجو انتخاب می‌شود. سپس به لایه‌ی پایین‌تر رفته و جستجو بین همسایه‌های آن بردار ادامه می‌یابد. این فرآیند تا رسیدن به آخرین لایه تکرار می‌شود. وقتی به آخرین لایه رسیدیم و نزدیک‌ترین همسایه انتخاب شد، با احتمال بسیار بالایی، این همسایه نزدیک‌ترین بردار به بردار مورد جستجو در بین تمامی بردارها خواهد بود.این روش باعث می‌شود جستجو به‌طور کارآمد و با دقت بالا انجام شود.اعمال فیلتر بر اساس فراداده‌ی برداردر کوادرانت می‌توان همراه هر بردار اطلاعات دیگری را نیز ذخیره کرد (برای مثال، در کنار بردار تصویر چهره می‌توان کد ملی و مشخصات شخص را ذخیره کرد). کوادرانت قابلیت اعمال فیلتر بر اساس این مشخصات را دارد. برای مثال، می‌توان برای جستجوی بردار یک چهره در دیتابیسی از تمامی چهره‌های کشور، نتیجه را به بردارهای فقط یک شهر خاص محدود کرد.برای اعمال این فیلتر، در هر مرحله‌ی جستجو، فقط همسایه‌هایی که دارای آن ویژگی باشند انتخاب می‌شوند. یکی از بزرگ‌ترین چالش‌های این کار، عدم وجود آن ویژگی در همسایگی برداری است که در جستجو به آن رسیده‌ایم. کوادرانت برای حل این مشکل، به صورت موقت اتصالات جدیدی در حین جستجو ایجاد می‌کند تا جستجو ادامه یابد.سرعت کوادرانتکوادرانت در بنچمارک‌های مختلف اثبات کرده که قدرت بسیار بالاتری نسبت به رقبای خود در سرعت جستجو و مقیاس‌پذیری دارد.مقایسه‌ی کوادرانت با دیگران بر اساس تعداد درخواست بر ثانیهمقایسه‌ی کوادرانت با دیگران بر اساس تاخیر پاسخ هنگام جستجومقایسه‌ی کوادرانت با دیگران بر اساس تاخیر پاسخ هنگام افزودن بردار جدیدمقیاس‌پذیریکوادرانت تمامی بردارها را به دسته‌های کوچکی به نام شارد (shard) تقسیم می‌کند. هر شارد دارای تعدادی بردار می‌باشد. سپس این شاردها را روی نودهایی که در اختیار آن قرار داده شده توزیع می‌کند، به این صورت که هر نود تعدادی شارد روی خود خواهد داشت و در صورت نیاز هر شارد می‌تواند روی بیشتر از یک نود کپی شود.کوادرانت هنگام جستجو، ابتدا شاردهایی که احتمال وجود پاسخ در آنها وجود دارد را تخمین می‌زند و سپس به نزدیک‌ترین نودهای دارای آن شاردها درخواست جستجو می‌فرستد. سپس پاسخ‌ها را دریافت کرده و بهترین آنها را انتخاب می‌کند.جمع‌بندیمی‌توان از روی داده‌های مختلف بردارهایی به دست آورد که برای داده‌هایی با معنای مشابه، این بردارها نزدیک به هم شوند.دیتابیس‌هایی برای ذخیره و جستجو بر اساس شباهت بردارها توسعه یافته‌اند که به آنها وکتور دیتابیس گفته می‌شود.کوادرانت یک وکتور دیتابیس متن‌باز و بسیار کارآمد می‌باشد.کوادرانت با ساخت یک گراف از روی بردارها می‌تواند هنگام جستجو، نزدیکترین بردار را با دقت و سرعت مناسب پیدا کند.معماری کوادرانت مقیاس‌پذیر می‌باشد.</description>
                <category>Ali Zarean</category>
                <author>Ali Zarean</author>
                <pubDate>Wed, 16 Apr 2025 17:44:13 +0330</pubDate>
            </item>
                    <item>
                <title>فراموشخانه   پارت یک</title>
                <link>https://virgool.io/@aliezarean/%D9%81%D8%B1%D8%A7%D9%85%D9%88%D8%B4%D8%AE%D8%A7%D9%86%D9%87-%D9%BE%D8%A7%D8%B1%D8%AA-%DB%8C%DA%A9-hfmroceutjma</link>
                <description>بسم ربی الذی عالم بکل شیءفراموشخانهپرتو های نور رقص کنان از پنجره ی مات اتاق وارد میشدند و صورت دختر از گرمای مجلسشان گل انداخته بود. دختری جوان با قد متوسط و مو های مشکی زیبایی که مانند یک آبشار از اقیانوس سرش به گودال کمرش ریخته میشد روی فرش ساده و کهنه ی کف اتاق خوابیده بود. چشمان درشتش آنقدر زیر پلک های سنگین بیقراری کردند که دختر کم کم از خواب بیدار شد. تا جایی که یادش میآمد هنگام خواب در همچین اتاقی چشم بر هم نگذاشته بود. سعی کرد خاطرات دیروزش را مرور کند اما هرچه بیشتر تلاش کرد کمتر به نتیجه رسید. حتی مکانی که در آن خوابیده بود را هم به یاد نمیآورد. ذهنش همچون صفحه ای سفید جواب تمام سوال هایش را پر از خالی میکرد. سرمای ترسی مبهم به مغز استخوان هایش نفوذ کرد.صدایی ناشناس سرمای روحش را در گرمای خود غسل داد: ((چه عجب! بالاخره بیدار شدی.))دختر به سرعت از جایش بلند شد و مو های بلندش را از جلوی صورت کنار زد تا صاحب صدا را پیدا کند. کمی جلو تر پسری خنده رو که به نظر میامد چند سالی از خودش بزرگتر باشد به چهارچوب در تکیه داده بود.((سلام. من خشایار هستم. معمولا این جمله توی همچین شرایطی گفته نمیشه ولی از آشنایی باهات خوشوقتم.))دختر کمی بیشتر به او نگاه کرد. متوجه شد چشم های آبی خشایار در آبشار مشکی مو هایش غرق شده اند. صورت دختر دوباره گل انداخت.((سلام. من هم... شاید به نظرت احمقانه برسه ولی اسمم رو یادم نمیاد. اما از اینکه اینجا تنها نیستم خوشحالم.))خشایار پس از خنده ی ریزی به درب اتاق اشاره کرد و گفت: (( فقط اینجا بودنت نیست که توش با هم شریکیم. احتمالا سوالای زیادی داری. من قول میدم کمکت کنم. فعلا همراهم بیا.))صدایی در سر دختر تکرار شد: ((قول میدم کمکت کنم))هیچ دلیلی برای گوش دادن به حرف های پسر نداشت اما انگار نیرویی نامرئی او را کنترل میکرد؛ بی اختیار به سمت درب اتاق رفت. اتاق درون یک راهروی نسبتا بزرگ که در هر دو طرفش درهایی یک شکل با نظم خاصی خودنمایی میکردند قرار داشت و راهروی عریض تری به وسط آن میخورد.خشایار هنگام همراهی دختر تا وسط راهرو برایش توضیح داد: ((مطمئنم سوال های زیادی داری. قبل از هر چیز باید بگم که علاوه بر من و تو دوازده نفر دیگه هم اینجا زندگی میکنن و هممون مثل تو وقتی چشممونو توی یکی از این اتاقا باز کردیم هیچی از گذشته به یاد نمیاوردیم. حتی اسممون رو.))((پس یعنی خشایار..))((آره. خشایار اسمی بود که وقتی بیدار شدم یکی از قدیمیا بهم داد. میگفت به سیبیلام میاد. خب کجا بودیم؟ آهان. گذشته هامون. تا به حال آدمای زیادی به اینجا اومدن ولی هیچکدومشون نتونستن چیزی از قبل به خاطر بیارن.))((منظورت چیه که آدمای زیادی به اینجا اومدن؟ مگه نگفتی فقط سیزده نفرین؟))((گفتم الان سیزده نفریم. ولی قبل از ما آدمای زیادی به اینجا اومدن و رفتن.))((یعنی راه خروجی از اینجا وجود داره؟))((نه اونطور که فکر میکنی. ولی آره. صبر کن به راهروی تدارکات برسیم برات توضیح میدم.))در ادامه ی مسیر دختر در های درون راهرو را نگاه کرد و از روی برچسب های نصب شده روی هرکدامشان میتوانست حدس بزند ساکنین ساختمان در این اتاق ها زندگی میکنند.((خب اینم از راهروی تدارکات. راستش به جز آشپزخونه ای که همین اولین در سمت راستته دلیل دیگه ای واسه ی انتخاب این اسم توسط قدیمیا به ذهنم نمیرسه.))دختر به سمت راستش نگاهی انداخت: ((واو. حتما باید داخلش هم بزرگ باشه.))((آره. به نظر من بهترین بخش خونه همین بخشه. عاشقش میشی.))خشایار درب کشویی بزرگ را کنار کشید و منظره ی چندین یخچال بزرگ و تعدادی میز و صندلی و زن مسنی که روی یکی از صندلی ها مشغول خوردن سالاد بود نمایان شد: (( از سمت راست به ترتیب یخچال آبی برای نوشیدنی ها، یخچال سبز برای تنقلات، یخچال سفید برای غذا های سرد و دسر و یخچال نارنجی برای غذا های گرمه. البته فقط اسمشون یخچاله. هر موقع غذا خواستی کافیه فقط در یکیشونو باز کنی. یخچال ها بعد از هر بار استفاده پر میشن.))زن مسن چشمانش را از بشقاب سالاد برداشت و به چشمان متعجب دختر نگریست: ((سلام خشی. مهمون جدید حالش چطوره؟))((سلام سیمین خانوم. راستش هنوز کمی گیجه ولی میتونم با اطمینان بگم حالش از روز اول خودم به مراتب بهتره.))خشایار دو عدد لیموناد از یخچال آبی بیرون آورد و با اشاره به دختر که هنوز از دیدن اتاق در شوک بود به سمت راهرو حرکت کرد.((اتاق روبرویی محل رختشوییه. گاهی هم داخل یکی از مخزناش به تعداد افرادی که اینجا هستیم لباس نو قرار میگیره. اون جلویی که درش رنگ سفید داره محل تدفین کساییه که از اینجا میرن.))((وقتی بهم گفتی راه خرو..))خشایار باز هم وسط حرف دختر پرید و با خنده گفت: ((آره وقتی بهت گفتم یه راه خروج وجود داره منظورم مرگ بود. خیلی بهش فکر نکن. بیا این لیمونادو بزن به بدن. حالت بهتر میشه.))کمی از سرمای ترسی که میان استخوان هایش جا خوش کرده بود برگشت. باور این واقعیت که مجبور بود زندگی گذشته اش را کنار بگذارد و راه برگشتی نداشت برایش سخت بود. سعی میکرد با فکر به این امکان که در گذشته زندگی خوبی نداشته خود را دلداری دهد. اما خوب یا بد اهمیتی نداشت. مال خودش بود. حتی بیشتر. جزئی از خودش بود. رها کردن اموال امکان پذیرست. اما رها کردن خود...صدای خشایار او را از فکر بیرون آورد: ((فکر کنم تا الان دیگه فهمیده باشی که هرکدوم از اتاقای راهروی اصلی متعلق به شخصی هستن و اونی که داخلش بیدار شدی هم مال خودته.)) با کمی مکث ادامه داد: ((خب اینم از خونه. پیشنهاد میکنم فعلا کمی داخل اتاقت استراحت کنی و ساعت هفت برای دورهمی شبانه تو آشپزخونه بهمون ملحق شی. میتونی اونجا با بقیه ی افراد خونه هم آشنا بشی.))((اون در مشکی روبروی در سفید چیه؟))((آه پاک یادم رفته بود. اونجا کتابخونست. راستش کتابی اونجا نداریم اما دستنوشته هایی از قدیمی هایی که حوصله ی این کارارو داشتن موجوده. پیشنهاد میکنم خیلی درگیر اون اتاق نشی.))((چرا؟))((خب راستش معمولا اتفاقای خوبی برای کسایی که زیادی اونجا میتابن نمیوفته. آخریشون همین چند هفته ی پیش خودکشی کرد. اتفاقا اتاقش هم همونی بود که تو امروز داخلش بیدار شدی.))آخرین کلمه ی خشایار در سر دختر پیچید. &quot;بیدار شدی&quot; بیشتر شبیه خوابی بود که هر لحظه انتظار بیدار شدن از آن را داشت. دیگر هیچ چیز واقعی نبود. هیچ چیز درست نبود. هیچ چیز به دردش نمیخورد. او خودش را در زمان و مکانی دیگر جا گذاشته بود و منتظر بود با بیدار شدن به خودش برگردد.</description>
                <category>Ali Zarean</category>
                <author>Ali Zarean</author>
                <pubDate>Mon, 18 Jan 2021 19:34:29 +0330</pubDate>
            </item>
                    <item>
                <title>منِ او</title>
                <link>https://virgool.io/@aliezarean/%D9%85%D9%86-%D8%A7%D9%88-miigg0vzfkze</link>
                <description>بسم رب الذی جمیل و یحب الجمالاز جنون این عالم بیگانه را گم کرده امآسمان سِیرَم زمین خانه را گم کرده امنه من از خود نه کسی از حال من دارد خبردل مرا و من دل دیوانه را گم کرده امدچار حال عجیبی شده ام؛ عشق پیچیده تر از سادگی احساساتم است. اسمش را میگذارم دوست داشتن. گاهی کافیست چند کلامی با دختری همصحبت شوی تا گرمای نفس هایش یخ قلبت را آب کند یا نگاهت اتفاقی به سیاهی چشمانش بیفتد و خود را در آن تاریکی گم کنی. یا حتی فکر حضورش ملکه ی تخیلت شود. گمان کنم از فرمانروایی ملکه ی فکرش بود که دیوانه شدم. از پرسه در کوچه های چشمش بود که دنیای اطراف را فراموش کردم. و احتمالا به خاطر آتش کلام گرم یار است که روحم آب میشود و به جبین مینشیند.دل به امید روی او همدم جان نمیشودجان به هوای کوی او خدمت تن نمیکندمیگویند تحمل کنید. میگویند سرکه بخورید. کجایند که ببینند سوزش وجودم را زمان جوشیدن خونم همانند سیر و سرکه. سرکه به چه دردم میخورد وقتی هرچه از دریچه ی قلبم میگذرد خاصیت خورندگی پیدا میکند؟ و باز هم واعظی دلخوش وقتی چهار همسرش در خانه منتظرش بودند بالای منبر گفت تحمل کنید.دوای درد عاشق را کسی کو سهل پنداردز فکر آنان که در تدبیر درمانند درمانندچشم به روی تعفن گناه ببندم یا کور شوم بلکه رهایی یابم؟ نیش خنجر باباطاهر در چشمانم نقش یار را از دلم نزدود. این کوری فقط مرا از کعبه و بتخانه رهایی داد.به که در دنبال دل باشم به هرجا میرودمن که صائب کعبه و بتخانه را گم کرده امچه صنم پرست شوم و چه با صمد نشینم جانم ز تن برآید و به جانان نمیرسم. آخر روی سیاه من کجا و زلف سیاه یار کجا؟ قد خمیده ی من کجا و کمان ابروی یار کجا؟ چشم سفید من کجا و روی سپید یار کجا؟ به چه امیدی دست نیاز گدایان به ابریشم خسروانی زلفش دراز کنم؟از بهر بوسه ای ز لبش جان همی دهماینم همی ستاند و آنم نمیدهد</description>
                <category>Ali Zarean</category>
                <author>Ali Zarean</author>
                <pubDate>Sun, 17 Jan 2021 12:22:40 +0330</pubDate>
            </item>
            </channel>
</rss>