پرش به محتوای اصلی
پرش به محتوای مقاله

کتابخانه XY: رندر ۱۰۰ میلیون نقطه داده در ۰.۰۸ ثانیه با هسته Rust

·۱۳ مرداد ۱۴۰۵۴ دقیقه مطالعه۳ بازدید
کتابخانه نمودارسازی فوق‌سریع پایتون با پشتیبانی Rust: تعامل ۱۰۰ میلیون نقطه داده
کتابخانه نمودارسازی فوق‌سریع پایتون با پشتیبانی Rust: تعامل ۱۰۰ میلیون نقطه داده
اشتراک‌گذاری
واقعاً چه چیز جدید است؟

جایگزینی کامل فرمت JSON با بافرهای باینری تایپ‌شده در انتقال داده به مرورگر؛ این تغییر باعث کاهش حجم خروجی از ۲۵۹ مگابایت به ۲۵۸ کیلوبایت برای ۱۰ میلیون نقطه شده است.

تصور کنید می‌خواهید ۱۰۰ میلیون نقطه داده را روی یک نمودار رسم کنید و با یک کلیک، بدون هیچ تأخیری روی آن‌ها زوم کنید. این رویایی که تا پیش از این در پایتون به دلیل محدودیت‌های حافظه غیرممکن بود، اکنون با زمان خیره‌کننده ۰.۰۸۱ ثانیه به واقعیت تبدیل شده است.

Reflex AI کتابخانه XY را تحت لایسنس Apache-2.0 منتشر کرد تا مشکل قدیمی پایتون در رسم نمودارها را حل کند؛ مشکلی که در آن سرعت رندرینگ پس از عبور از چند صد هزار نقطه به‌سریع سقوط می‌کند. در اکثر ابزارهای بصری‌سازی پایتون، برای هر ردیف داده یک شیء گرافیکی مجزا ساخته می‌شود. این رویکرد باعث می‌شود زوم کردن یا نمایش جزئیات (Hover) در مقیاس بزرگ تقریباً غیرممکن شود. XY این رویکرد را با یک هسته Rust — که زبانی فوق‌سریع و ایمن برای مدیریت حافظه است — جایگزین کرده است. این هسته به‌جای ارسال فایل‌های سنگین JSON، بافرهای باینری تایپ‌شده را مستقیماً به مرورگر می‌فرستد و از WebGL2 برای رسم شتاب‌یافته توسط سخت‌افزار استفاده می‌کند.

بنچمارک‌های عملکرد

به نقل از گزارش Marktechpost، تفاوت عملکرد XY در مقایسه با استانداردهای فعلی روی سخت‌افزار Apple M5 Pro تکان‌دهنده است. در این آزمایش‌ها، ساعت زمان تنها زمانی متوقف شده که بوم رسم در ۱۰ فریم متوالی (که از نظر بایتی کاملاً یکسان هستند) پایدار شده باشد:

  • در ۱۰ میلیون نقطه: XY در ۰.۰۸۳ ثانیه رندر می‌کند، در حالی که Matplotlib (نسخه WebAgg) حدود ۲.۸۰۴ ثانیه و Plotly (نسخه scattergl) حدود ۳.۳۶۷ ثانیه زمان می‌برند. این یعنی افزایش سرعت ۳۴ برابری.
  • در ۵۰ میلیون نقطه: سرعت XY در ۰.۰۷۶ ثانیه باقی می‌ماند، اما Matplotlib به ۱۳.۳۸۵ ثانیه کند می‌شود و Plotly به‌طور کلی در رندرینگ شکست می‌خورد. این یک جهش ۱۷۷ برابری در سرعت است.
  • در ۱۰۰ میلیون نقطه: XY همچنان در ۰.۰۸۱ ثانیه پایدار است، در حالی که رقبای سنتی از پس این حجم برنمی‌آیند و قادر به نمایش نیستند.
  • بهره‌وری حافظه: برای ۱۰ میلیون نقطه، XY تنها ۰.۳۲ گیگابایت حافظه پیک (Peak) در سمت پایتون اشغال می‌کند، در حالی که این عدد برای Matplotlib برابر ۰.۸۴ و برای Plotly حدود ۱.۸۶ گیگابایت است.

GenOffice: مجموعه اداری رایگان و بدون تبلیغات Genspark با اسناد، صفحات، ارائه و PDF برای macOS و Windows

سلسله‌مراتب نمایش داده‌ها

از نظر فنی، XY برای حفظ سرعت از مکانیزمی به نام «سلسله‌مراتب نمایش» (Representation Ladder) استفاده می‌کند. داده‌ها در قالب ستون‌های f64 در یک ColumnStore پایتونی ذخیره می‌شوند و مدل رندرینگ بر اساس اندازه تریک (Trace Size) انتخاب می‌شود:

  • Decimation: برای خطوط مرتب طولانی، اگر تعداد ردیف‌ها از ۱۰,۰۰۰ مورد بیشتر شود، فرآیند M4 Decimation فعال می‌شود تا تعداد نقاط کاهش یابد اما شکل کلی حفظ شود.
  • Density: برای داده‌های پراکنده (Scatter)، اگر تعداد نقاط از ۲۰۰,۰۰۰ مورد فراتر رود، حالت تراکم خودکار فعال می‌شود.
  • Grids: شبکه‌های تراکم به‌طور پیش‌فرض روی ۵۱۲ در ۳۸۴ سلول تنظیم شده‌اند.

همان‌طور که در تحلیل‌های قبلی ما درباره بهینه‌سازی‌های سطح پایین در زبان‌های برنامه‌نویسی اشاره کردیم، جابجایی پردازش از لایه تفسیرشده (Interpreted) به لایه کامپایل‌شده (Compiled) تنها راه عبور از سد حافظه است. طبق اعلام Reflex، این آستانه‌ها فعلاً مربوط به سیاست‌های نسخه‌های پیش‌از-۱.۰ هستند و تضمین قطعی API محسوب نمی‌شوند. با این حال، باید توجه داشت که اگرچه تراکم به‌صورت بومی دسته‌بندی (Binning) و توسط GPU رندر می‌شود، اما فرآیندهای دریافت، دسته‌بندی و کاهش نقاط همچنان با تعداد ردیف‌های منبع مقیاس‌پذیر هستند.

با وجود این بهینه‌سازی‌ها، یکپارچگی داده‌ها کاملاً حفظ شده است. چون مقادیر دقیق همچنان در پایتون باقی می‌مانند، تابع pick() و ابزارهای Hover همچنان می‌توانند ردیف‌های اصلی را بازیابی کنند. وقتی روی یک پنجره کوچک زوم می‌کنید، یک درخواست برای نقاط دقیق قابل مشاهده در یک پنجره تراز شده (Aligned Window) ارسال می‌شود. جابجایی‌های (Pan) نزدیک به آن ناحیه، از همان پنجره کش‌شده رندر می‌شوند بدون اینکه درخواست جدیدی ارسال شود.

رابط برنامه‌نویسی و یکپارچه‌سازی

برای توسعه‌دهندگان، رابط برنامه‌نویسی (API) این کتابخانه به‌صورت Declarative است و از اجزای Markها، محورها، راهنمای نمودار (Legends)، Tooltipها و یادداشت‌ها تشکیل شده است. این ابزار از ۱۴ خانواده نمودار پشتیبانی می‌کند، از جمله:

  • Scatter و Line
  • Area و Histogram
  • Box و Violin
  • ECDF، Heatmap، Hexbin و Contour

استایل‌دهی در این کتابخانه از طریق اسلات‌های پایدار DOM، کلاس‌های CSS و Tailwind را می‌پذیرد. برای تسهیل مهاجرت، XY قابلیت import xy.pyplot as plt را ارائه داده تا کاربران بتوانند کدهای رایج Matplotlib را اجرا کنند، هرچند راهنمای سازگاری اشاره می‌کند که همه قابلیت‌ها پشتیبانی نمی‌شوند. همچنین یک آداپتور به نام reflex-xy وجود دارد که هر نمودار را بدون نیاز به جاوااسکریپت یا iframe به یک کامپوننت Reflex تبدیل می‌کند.

کاربردهای عملی و استقرار

این تغییر، پیش‌فرض‌های تحلیل داده در حوزه‌هایی مثل مالی کمی (داده‌های Tick)، ژنومیک و بیوانفورماتیک (نمودارهای Manhattan و اسکن‌های فرکانس آلل)، نظارت سیستم‌ها (Observability)، تله‌متری، نجوم و تحلیل‌های زمین‌فضایی را تغییر می‌دهد. تا پیش از این، استاندارد این بود که داده‌ها پیش از رسم، نمونه‌برداری (Downsampling) شوند تا مرورگر کرش نکند. Reflex حتی رندر کامل مجموعه‌داده OpenStreetMap با ۱۰ میلیارد نقطه را گزارش کرده است.

با این حال، باید توجه داشت که XY در حال حاضر در نسخه ۰.۰.۱ و در مرحله Alpha است. این ابزار برای نوت‌بوک‌های داخلی و خروجی‌های HTML قابل اشتراک عالی است، اما هنوز برای مسیرهای حساس تجاری و مشتری-محور در محیط‌های سازمانی تحت نظارت توصیه نمی‌شود. تیم‌های داده می‌توانند با دستور pip install xy (در پایتون ۳.۱۱ یا جدیدتر) آن را نصب کنند.

چه در حال رصد داده‌های Tick باشید و چه اسکن‌های فرکانس آلل، این بهره‌وری خیره‌کننده است. در حالت density=False (غیرفعال‌سازی تراکم)، XY همچنان می‌تواند ۱۰۰ میلیون مارکر دقیق را در ۱.۳۴۳ ثانیه روی ۵.۲۶ گیگابایت حافظه رسم کند. جالب‌ترین نکته در حجم خروجی است: یک نمودار تعاملی ۱۰ میلیون نقطه‌ای در XY تنها ۲۵۸ کیلوبایت حجم HTML دارد، در حالی که معادل آن در Plotly به ۲۵۹ مگابایت می‌رسد. این حجم Payload برای داده‌هایی از ۱ میلیون تا ۱۰۰ میلیون ردیف، تقریباً در همان سطح ۲۵۸ کیلوبایت باقی می‌ماند.

گام بعدی شما

  • اگر با داده‌های حجیم در Pandas سر‌و‌کله می‌زنید، کتابخانه XY را جایگزین Plotly کنید تا سرعت لود داشبوردها را بررسی کنید.
  • برای کاهش حجم فایل‌های HTML ارسالی به مشتری، از قابلیت فشرده‌سازی باینری این ابزار استفاده کنید.
  • مستندات سازگاری با Matplotlib را مطالعه کنید تا متوجه شوید کدام بخش از کدهای قدیمی شما بدون تغییر اجرا می‌شوند.

اما داستان سخت‌افزاری این تحول حتی شگفت‌انگیزتر است؛ برای درک اینکه چگونه GPUها این حجم از داده را مدیریت می‌کنند، به تحلیل ما درباره معماری‌های جدید شتاب‌دهنده مراجعه کنید.

چرا این موضوع مهم است؟

این ابزار با حذف نیاز به Downsampling، دقت تحلیل‌های کمی در علوم زیستی و مالی را به شدت افزایش می‌دهد. استفاده از WebGL2 و Rust باعث می‌شود تحلیلگران بتوانند بدون نیاز به سرورهای قدرتمند، داده‌های میلیارد-نقطه‌ای را در مرورگرهای معمولی بررسی کنند.

تأثیر برای ایران

توسعه‌دهندگان ایرانی در حوزه‌های فین‌تک و بیوانفورماتیک می‌توانند با جایگزینی این کتابخانه متن‌باز، هزینه‌های پردازشی سرورهای خود را کاهش داده و تجربه کاربری سریع‌تری برای تحلیل داده‌های حجیم ایجاد کنند.

·نگاه ما
تحریریه دات‌هوش

انتقال لایه رندرینگ از JSON به بافرهای باینری Rust، عملاً مفهوم «نمونه‌برداری اجباری» را در بصری‌سازی داده‌ها منسوخ می‌کند. این رویکرد نشان می‌دهد که گلوگاه اصلی در تحلیل داده‌های حجیم، نه در قدرت پردازش پایتون، بلکه در نحوه انتقال داده بین حافظه سیستم و GPU مرورگر بوده است. احتمالاً در آینده نزدیک، تمامی کتابخانه‌های بصری‌سازی پایتون مجبور به پذیرش هسته‌های Rust یا C++ برای بقا در عصر Big Data خواهند بود.

منابع

این گزارش با خط‌لولهٔ خودکار دات‌هوش از منابع معتبر جهانی تدوین و زیر نظر تحریریه منتشر شده است. روش کار ما

گفتگو

پنج‌شنبه‌های هوش‌محور

بسته‌ی هفتگی دات‌هوش

۵ خبر، ۲ ابزار، ۱ پرامپت در هر شماره. به‌زودی راه‌اندازی می‌شود — هر پنج‌شنبه صبح.

خبر کلیدی
ابزار کاربردی
پرامپت حرفه‌ای
تحلیل پژوهش
به‌زودی
زاویه‌ی ایرانی
به‌زودی
تمرین این هفته
به‌زودی

راهنماهای دات‌هوش

راهنماهای کاربردیِ دات‌هوش برای کار با هوش مصنوعی — از همین‌جا شروع کنید:

دات‌هوش

راهنمای فارسی هوش مصنوعی — با نگاه به ایران

اخبار روزانه، معرفی ابزارها و مدل‌ها، و آموزشِ کار با هوش مصنوعی؛ همیشه با این پرسش که از ایران چه چیزی کار می‌کند و چه چیزی نه.