Rust لمعالجة البيانات الضخمة: معالجة ملايين الصفوف أسرع من Python

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

لماذا Rust هو الملك الجديد لمعالجة البيانات الضخمة؟

\n\n

هل سبق لك أن انتظرت 20 دقيقة بينما يقوم سكريبت Python بمعالجة ملف CSV بحجم 10 جيجابايت؟ ثم 10 دقائق أخرى لأن الذاكرة نفدت وانتقل النظام إلى الذاكرة الافتراضية؟ مألوف؟

\n\n

لفترة طويلة، كان عالم البيانات الضخمة ملكًا لـ Python ونظامه البيئي: Pandas، NumPy، Dask. لكن هناك مشكلة واحدة - Python بطيء. بطيء جدًا. وعندما تُقاس البيانات بالتيرابايت، تتحول كل ملي ثانية إضافية إلى ساعات من التوقف.

\n\n

هنا يظهر Rust على المسرح. لغة نظامية توفر أداء C++ وأمان الذاكرة، ولكن مع بناء جملة يمكن (تحذير من حرق الأحداث) أن تحبه. ونعم، إنها مثالية لـ معالجة البيانات الضخمة.

\n\n

في هذه المقالة، سنشرح كيف يسمح Rust بمعالجة كميات هائلة من البيانات بشكل أسرع وأكثر أمانًا وباستهلاك أقل للذاكرة. بدون سحر - فقط كود وقياسات.

\n\n

Rust مقابل Python للبيانات الضخمة: ما في الداخل؟

\n\n

دعنا نذهب مباشرة إلى الأرقام. إليك اختبار بسيط: قراءة ملف CSV بحجم 500 ميجابايت، تصفية الصفوف حسب شرط، وحساب المجموع.

\n\n\n\n\n\n\n
المعاملPython (Pandas)Rust (Polars)
وقت التنفيذ12.4 ثانية0.8 ثانية
ذروة استهلاك RAM2.1 جيجابايت380 ميجابايت
عدد الصفوف5 ملايين5 ملايين
\n\n

أسرع بـ 15 مرة وأكثر اقتصادًا في الذاكرة بـ 5 مرات. وهذا ليس الحد الأقصى. يمنحك Rust التحكم في كل بايت، في كل تخصيص. إنه لا يغفر الأخطاء، لكنه يعطي سرعة لن يلحقها Python أبدًا.

\n\n

مجموعة أدوات Rust للبيانات الضخمة

\n\n

قبل كتابة الكود، دعنا نرى ما هو موجود في الترسانة. Rust لا يقف مكتوف الأيدي - النظام البيئي للعمل مع البيانات ينمو بنشاط.

\n\n

المكتبات الرئيسية

\n
    \n
  • Polars - مشابه لـ Pandas، لكن على Rust. يدعم الحسابات الكسولة، المعالجة المتوازية، ويعمل مع البيانات التي لا تتسع في الذاكرة.
  • \n
  • Apache Arrow - تنسيق بيانات عمودي يسمح بتبادل البيانات بين اللغات المختلفة دون نسخ.
  • \n
  • DataFusion - محرك SQL على Rust يمكنه تنفيذ الاستعلامات مباشرة على بيانات Arrow.
  • \n
  • rayon - مكتبة للتكرار المتوازي. تسمح بموازاة أي معالجة بسهولة.
  • \n
  • csv - محلل سريع لملفات CSV مع الحد الأدنى من التخصيصات.
  • \n
  • serde - تسلسل/إلغاء تسلسل. إلزامي للعمل مع JSON، YAML، TOML.
  • \n
\n\n

سنستخدم Polars و rayon، حيث أن هذا هو المعيار الفعلي لـ معالجة البيانات الضخمة على Rust.

\n\n

مثال عملي: معالجة سجلات خادم الويب

\n\n

تخيل أن لديك 100 مليون سجل من سجلات Nginx. تحتاج إلى:

\n
    \n
  1. تصفية أخطاء 5xx فقط
  2. \n
  3. التجميع حسب عنوان IP
  4. \n
  5. حساب عدد الأخطاء لكل IP
  6. \n
  7. عرض أفضل 10 مخترقين
  8. \n
\n\n

على Python مع Pandas، سيستغرق هذا حوالي 2-3 دقائق وسيستهلك كل ذاكرة الوصول العشوائي. على Rust - 15-20 ثانية.

\n\n

هيكل البيانات

\n

لنفترض أن كل سجل يبدو هكذا:

\n
192.168.1.1 - - [10/Oct/2023:13:55:36 +0000] "GET /api/data HTTP/1.1" 500 1234 "-" "Mozilla/5.0"
\n\n

نحتاج إلى تحليل السلسلة، واستخراج IP ورمز الاستجابة. في Rust، يتم ذلك من خلال نوع هيكلي مخصص:

\n\n
use serde::Deserialize;\n\n#[derive(Debug, Deserialize)]\nstruct LogEntry {\n    ip: String,\n    status_code: u16,\n    method: String,\n    path: String,\n    user_agent: String,\n}
\n\n

تحليل CSV باستخدام Polars

\n

Polars هو ما يستحق التجربة من أجله

المدونات

توصيات الكتب