Perl5 كلغة علوم بيانات

[منتهي] آخر تحديث بواسطة في Fri, 17 Apr 2026    مصدر
 

علوم البيانات

مقدمة السلسلة — Post 0 of N
هذا المنشور هو الأول في سلسلة توثق التطوير المشترك لمحرك قاعدة بيانات متجه (VDBE) مكتوب بالكامل في Perl5 + PDL. في وقت لاحق، تمر المشاركات عبر كل مكون من مكونات هذا المحرك ؛ هذا واحد يضع المسرح. الزخم الرئيسي لهذه السلسلة ليس أن تقوم بتفريغ VDBE الخاص بك لأنني لا أقوم بمطالبات الأداء، ولكن لإظهار كيف يمكن للمرء استخدام Perl لتحقيق أي شيء يمكنك تحقيقه بأي لغة أخرى، ولكن أكثر ذكاءً!


جدول المحتويات


1. لماذا Perl5 لعلوم البيانات؟

عندما يناقش علماء البيانات خيارات اللغة، تتقارب المحادثة بسرعة على بايثون أو R أو جوليا. نادرا ما يحصل Perl5 على مقعد على الطاولة - لكنه يحمل مجموعة مقنعة من السمات التي تستحق نظرة ثانية. هذه السمات لم تتغير ماديا على مر السنين (Perl5 كان دائما بهذه الطريقة!)، ولكن ما لم لقد تعرضت للغة وتعلمت أن تقدر قسوتها وعقلانيتها ومرونتها وإمكانية التعبير عنها واستخدمتها فعليًا لدفع عملك إلى الأمام.، كنت لا تعرف هذه الميزات لا تأتي فقط مجانا مع Perl5، ولكن يمكن أن تساعدك على دفع مشاريعك إلى الأمام.

نشر في كل مكان بدون تثبيت

Perl5 يتم الشحن كمكون افتراضي لكل نظام تشغيل يشبه UNIX تقريبًا - تتضمن توزيعات لينكس وmacOS وBSDs والعديد من بيئات لينكس المضمنة جميعها عملًا بيرل ثنائي خارج الصندوق. تعمل بايثون على تحقيق تقدم هنا، ولكن لا يزال من الشائع العثور على خوادم بدون رأس أو أجهزة شبكة أو عقد تسجيل دخول HPC.
حيث بيرل موجود وكومة بايثون كاملة ليست كذلك. يمكن تشغيل مسار بيانات مكتوب في Perl في اليوم الأول بدون اتفاق بيئة، a ثؤلولأو حاوية.

إمكانية النقل من مركز البيانات إلى الحافة

يمكن تشغيل نفس الاسكربت الذي يحلل مجموعة بيانات تيرابايت على نقطة توصيل الحوسبة عالية الأداء (HPC) ذات 256 نواة، مع تغييرات تكوين بسيطة، على Raspberry Pi أو عبّارة IoT أو وحدة تحكم مضمنة. بيرل’نموذج النشر الثنائي الأحادي والنفقات الإضافية المنخفضة لوقت التشغيل تجعله حقيقيًا “الكتابة مرة واحدة، تشغيل في أي مكان” اللغة في البيئات حيث بايثون’المترجم العلوية أو جوليا’وقت الإحماء JIT سيكون غير مقبول.

إذا كنت تخطط للنشر في أي مكان و everywhere Perl5 هو خيارك الواضح.

تراث مبني على نصوص وبيانات

تم تصميم Perl من الألف إلى الياء لمعالجة النصوص والتعبيرات العادية و “لزاق” العمل بين مكونات النظام. في الممارسة العملية، تهيمن على خطوط البيانات العلمية ليس من خلال الحساب الرقمي ولكن من خلال *التنازع على البيانات *: قراءة تنسيقات الملفات غير المتجانسة، وتنظيف السجلات الفوضوية، والانضمام إلى مجموعات البيانات من مصادر مختلفة، ونتائج التوجيه إلى المكونات المستهلكة في المراحل النهائية.

بيرل’لا يزال محرك regex من بين أقوى ما هو متاح، ويمكن للخط الواحد إنجاز مهام تنظيف البيانات التي تتطلب مكتبات مساعدة بلغات أخرى.

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

في هذا العالم الجديد الشجاع، Perl5’يسمح التاريخ الغني له بالتألق كمكون لسير العمل أو كلغة تطبيق تقوم بتنفيذ عمليات سير العمل هذه.

CPAN: نظام بيئي للوحدة تم اختباره في المعركة

تستضيف شبكة أرشيف بيرل الشاملة (CPAN) أكثر من 200,000 وحدة عبر كل مجال يمكن تخيله. على الرغم من أن عروض علوم البيانات ليست واسعة مثل بايثون، إلا أن المكونات الأساسية للبناة المخصصين موجودة:

بيرل الحديثة ليست جدك’s بيرل

يتم سحب الميزات أدناه مباشرة من ملاحظات الإصدار الرسمية (perl5360delta, perl5380delta, perl5400delta) ويتم تنظيمها من خلال الإصدار الذي وصلت فيه إلى حالة مستقرة أو تم تقديمها لأول مرة. يتم تمييز الميزات ذات الصلة بأحمال عمل علوم البيانات والحوسبة العلمية فقط.

بيرل 5.36 — مايو 2022

(مستقر منذ 5.36؛ تجريبي منذ 5.20) — يتم الآن تعريف معلمات الوظيفة بالاسم، مع افتراضات اختيارية. الـ //= و ||= تمت إضافة عوامل تشغيل القيمة الافتراضية إلى التوقيعات في الإصدار 5.38، مما يسمح بالقيم الافتراضية التي يتم تشغيلها إلغاء تعريف أو زيف على التوالي:

  use v5.36;
  sub clamp ($val, $lo = 0, $hi //= 1) {
      $val < $lo ? $lo : $val > $hi ? $hi : $val;
  }
  use v5.40;
  use builtin 'indexed';

for my ($i, $val) (indexed @scores)  { ... } # index and value

أو الحصول على قيم متعددة في نفس الوقت

  use v5.40;

for my ($val1, $val2, $val3) (@scores)  { ... }

بيرل 5.38 — يوليو 2023

  use feature 'class';
  no warnings 'experimental::class';

class Vector2D {
      field $x :param;
      field $y :param;
      method magnitude { sqrt($x**2 + $y**2) }
  }
  my $v = Vector2D->new(x => 3, y => 4);
  say $v->magnitude;    # 5

بيرل 5.40 — يونيو 2024

  use v5.40;
  try {
      my $result = load_and_process($file);
  }
  catch ($e) {
      warn "Pipeline error: $e";
  }
  finally {
      close_resources();   # runs whether or not an exception was thrown
  }

(جرب::صغير / ميزة::Compat::جرب هناك حاجة فقط عند استهداف بيرلز أقدم من 5.34.)

ميزات قديمة (pre-5.36)

** المراجع من الدرجة الأولى والإغلاق** - الغواصات المجهولة، والإغلاق، والبناء المرجعي أساسي وكانت مستقرة منذ بيرل 5.

مدمج مع عربدة أو تلفن لإدارة الإصدارات و كرتون بالنسبة إلى لقطات التبعية القابلة لإعادة الإنتاج، يبدو مشروع Perl الحديث ويشبه جهدًا هندسيًا للبرامج من الدرجة الأولى.

قيود صادقة

لا توجد حالة لبيرل كاملة دون صدق حول مكان قصورها:

الزخم المجتمعي - تجمع مجتمع علوم البيانات على بايثون و R. إن العثور على دروس جاهزة وإجابات تجاوز المكدس والمؤلفين المشاركين أصعب.


2. نظام Perl Data-Type — نقاط القوة وحدود Cache-Era

أنواع بيرل الأساسية

بيرل’مركز نموذج البيانات الأساسي على ثلاثة بنى:

بناء سيجل ما يحمله
الاستهلاك $ قيمة واحدة: رقم أو سلسلة أو مرجع أو إلغاء تعريف
الصفيف @ قائمة مرتبة من الحروف، مفهرسة بعدد صحيح
** هش** % مجموعة غير مرتبة من قيم الاستهلاك التي تم إدخالها بواسطة السلسلة

كل شيء آخر — الكائنات، الإغلاق، هياكل البيانات المعقدة — مبني من هذه القيم البدائية الثلاثة عبر المراجع (\@array, \%شفرة هاش, تحتي { ... }).

هذا النموذج مرن للغاية. يمكن أن يحتوي الصفيف الواحد على أعداد صحيحة وأرقام فاصلة عشرية وسلاسل ومراجع متداخلة في وقت واحد. هذه المرونة هي بالضبط ما جعل بيرل اللغة المهيمنة لإدارة النظام وكتابة الويب لمدة عقدين.

مشكلة تدرج الذاكرة المخبئية

لا تحقق وحدات المعالجة المركزية الحديثة أقصى إنتاجية إلا عند تدفق البيانات عبر ذاكرة التخزين المؤقت L1/L2/L3 في كتل كبيرة ومتجاورة — خاصية تسمى الموقع المكاني. صفائف Perl لا توفر هذا. تحت غطاء محرك السيارة، صفيف بيرل هو صفيف C من مؤشرات إلى كومة مخصصة (SV) الهياكل. يحمل كل مقياس عدد مرجعي وعلامة نوع وحشو - عادة 24-56 بايت لكل استهلاك على بناء 64 بت. وبالتالي فإن تكرار أكثر من مليون عنصر من صفيف بيرل ينطوي على مليون مؤشر متناثر عبر الكومة، مما ينتج نمطًا لخطأ الذاكرة المخبئية ينفي تمامًا ميزة السرعة لخطوط أنابيب SIMD الحديثة.

نتيجة ملموسة: منتج نقطة من اثنين من ناقلات 1 000 عنصر مكتوبة في بيرل النقي هو تقريبا 100-1000 × أبطأ من العملية المكافئة على زوج من ndarrays تعويم PDL، والتي تحتل منطقتين مسطحتين، 4 000 بايت منطقة الذاكرة التي تناسب بشكل مريح في ذاكرة التخزين المؤقت L1.

قارن مع R

R تحتل أرضية وسط غريبة. مثل بيرل، إنها لغة ديناميكية ومفسرة - المتغيرات هي حاويات غير مكتوبة، والوظائف هي قيم من الدرجة الأولى، و REPL التفاعلي هو بيئة التطوير الأساسية. R حتى لديه نظائر مباشرة إلى بيرل’الأنواع الثلاثة الأساسية:

مفهوم بيرل R التناظرية
$scalar المتجه الذري length-1 أو قائمة الاستهلاك
@array أسلوب القائمة
%hash مسمى أسلوب القائمة
المرجع (\@arr) لا يستخدم R مراجع صريحة؛ دلالات النسخ عند التعديل بدلاً من ذلك

لكن R’s workhorse type، أي atomic vector ليس له نظير Perl مباشر. المتجه الذري R هو كتلة متجاورة ومكتوبة بشكل متجانس من الذاكرة - بالضبط التخطيط الذي تكافئه ذاكرة التخزين المؤقت لوحدة المعالجة المركزية. كل فروة رأس مدمجة في R هي في الواقع ناقل ذري طوله 1 ؛ لا يوجد “أحادي القيمة” خارج ناقلات الذرية.

يعني اختيار التصميم هذا أن شفرة R تعمل بشكل طبيعي على ناقلات الملايين من الزوجي مع إنتاجية مستوى BLAS، دون أن يكتب المستخدم حلقة واحدة أو يخصص حلقة خاصة “صفيف” كائن.

RR’الأنواع الذرية هي:

النوع الذري R التخزين C المكافئ
منطق 4 بايت / عنصر عدد صحيح (بالإنجليزية: NA sentinel)
عدد صحيح 4 بايت / عنصر int32_t
مزدوج 8 بايت / عنصر مزدوج
معقد 16 بايت/عنصر _مركب مزدوج
رمز مؤشر إلى CHARSXP حرف * (متدرب)
خام 1 بايت / عنصر uint8_t

R يحدد أيضا الهياكل ذات المستوى الأعلى المبنية على ناقلات الذرية:

الدرس: R’يتدفق أداء الحوسبة عند استخدامه في التطبيقات الإحصائية وعلوم البيانات مباشرة من ناقلاتها الذرية المتجاورة. بيرل’المسار المكافئ للأداء هو امتداد (وهو أيضًا مستقل ماتلاب مثل البيئة)، لغة بيانات بيرل لغة تعريف البيانات.


3. إدخال PDL: الصفائف N-Dimensional المكتوبة بشكل قوي

لغة بيانات بيرل (PDL، pdl.perl.org) يمتد بيرل مع ndarrays (صفائف N-dimensional): مخازن مؤقتة للذاكرة متجاورة ومكتوبة بقوة تبدو وكأنها كائنات بيرل من الدرجة الأولى.

use PDL;

# A 1-D float ndarray — 4 bytes × 5 elements in one contiguous block
my $v = float( 1.0, 2.0, 3.0, 4.0, 5.0 );

# A 128-dimensional random database of 1000 vectors — all in cache-friendly memory
my $db = random( 128, 1000 );   # double by default

# Dot product of every DB vector against a query — a single BLAS call
my $scores = $db x $query->transpose;

أنواع PDL البدائية

يعرض PDL لوحة الألوان الكاملة للأنواع الرقمية C كمكونات من الدرجة الأولى:

نوع PDL وحدات البايت النوع C المكون
بايت 1 uint8_t بايت (...)
قصور 2 int16_t قصيرة (...)
قلعة 2 uint16_t ushort(...)
طويل 4 int32_t طويل (...)
الهند 4 أو 8 ssize_t إنديكس(...)
طويل 8 int64_t طويلة (...)
عائم 4 عائم عائم(...)
مزدوج 8 مزدوج مزدوج (...)
عرس 8 تعويم مركب _Complex تعويم(...)
مزدوج 16 _مركب مزدوج cdouble(...)

الخيوط و SIMD

واحدة من PDL’الميزات الأكثر تميزًا هي *خيوط ضمنية *: يتم بث العمليات تلقائيًا عبر أبعاد إضافية، مما يؤدي إلى التخلص من الحلقات الصريحة في رمز المستخدم وتفويض الحلقات الداخلية إلى نواة C أو Fortran المحسنة. مدمج مع set_autopthread_targ(N)، سوف PDL موازية تلقائيا شرائح مستقلة عبر لا سلاسل عمليات نظام التشغيل — دون أن يقوم المستخدم بكتابة واحدة شوكة أو الموضوع::قائمة الانتظار اتصل.

قيم غير صحيحة

PDL لديها مفهوم مدمج للقيم السيئة (PDL::سيئة)، مماثلة مباشرة لR’ss غير متاح. يمكن وضع علامة على مصفوفة ndarray على أنها “واعي بالقيمة السيئة”تقوم عمليات، وPDL بنشر الخطأ بشكل صحيح من خلال العمليات الحسابية والإحصائية وعمليات الإدخال/الإخراج.


4. نوع المقارنة: بيرل، PDL، وR جنبا إلى جنب

يخطط الجدول أدناه كل نوع R شائع الاستخدام إلى أقرب نظرائه من Perl و PDL، مع تسليط الضوء على المكان الذي تتفق فيه اللغات الثلاث أو تختلف أو تكمل بعضها البعض.

نوع R مكافئ Perl مكافئ PDL الملاحظات
مزدوج (طول-1) $x = 3.14 (سكالار) مزدوج(3.14) — شكل () R ليس لديه مستعر; كل شيء متجه
عدد صحيح (طول-1) $n = 42 (سكالار) طويل(42)
منطق (طول-1) علامة $ = 1 / $flag = 0 بايت(1) يستخدم بيرل الصدق؛ يستخدم PDL 0/1 بايت
مزدوج متجه @arr = (1-1، 2-2، 3-3) مزدوج (1.1، 2.2، 3.3) PDL: متجاورة. @arr: مصفوفة المؤشر
عدد صحيح متجه @arr = (1، 2، 3) طويل(1، 2، 3)
منطق متجه @flags = (1، 0، 1) بايت (1، 0، 1)
معقد متجه — (غير مضمن) cdouble(...) احتياجات بيرل الرياضيات::Complex; PDL لديها دعم أصلي
رمز متجه @strs = ('عام','كيف') — (غير رقمي) PDL تعمل على الأرقام فقط
خام متجه حزمة('C*', @bytes) بايت (...)
غير متاح إلغاء تعريف القيمة غير الصحيحة في ndarray يتم نشر القيم غير الصحيحة لـ PDL مثل R’ss غير متاح
خالٍ إلغاء تعريف في سياق القائمة
قائمة @array أو مرجع \@array
مسمى قائمة %hash أو \%شفرة هاش
ماتريكس (2-D) مصفوفة الصفائف @aoa 2-D ندراي pdl([[...],[...]]) PDL: العمود الرئيسي؛ R: العمود الرئيسي
صفيف (N-D) المراجع المتداخلة N-D ndarray $x->reshape(...)
data.frame %hash من @arrays 2-D ndarray (أعمدة رقمية) + شفرة هاش بيرل (مختلطة) لا يوجد تخطيط من نوع PDL واحد بالضبط
عامل جدول البحث هاش + @indices طويل ندراي + بيرل @levels صفيف
بيئة %hash أو مساحة اسم الحزمة
وظيفة / إغلاق تحتي { ... } / إغلاق PDL PP يعرّف النواة المجمعة
كائن S3 / S4 المرجع المبارك + إرسال الأسلوب كائن PDL (مصفوفة ndarray المبسطة) كائنات PDL هي كائنات Perl من الدرجة الأولى

الوجبات الرئيسية

ومع ذلك، فإن الجمع بين Perl+PDL+R (مع استخدام الأخير كمكون، أو فعال عبر بيرل)


5. خريطة الطريق: ما تغطيه بقية هذه السلسلة

توثق هذه السلسلة تكوين محرك قاعدة بيانات vector مضمن في Perl5 + PDL من البداية. تدعم قواعد بيانات المتجهات مسارات الإنشاء المعزز للاستعادة الحديثة (RAG) والبحث الدلالي وأنظمة التوصية الأقرب إلى الجوار. تطبيق واحد من المبادئ الأولى هو وسيلة ممتازة لإظهار PDL’s القدرات العددية جنبا إلى جنب مع بيرل’نقاط قوة برمجة الأنظمة.

يحتوي الدليل الذي تم تطويره جنبًا إلى جنب مع هذه المنشورات على المكونات التالية، والتي سيكون كل منها موضوعًا لواحدة أو أكثر من المنشورات المخصصة التي ستشير إلى الملفات في مستودع مخصص.

المشاركة 1 - التسلسل والإدخال/الإخراج: VectorIO الوحدة النمطية

ملف: VectorIO.pm

المحرك يخزن ناقلات كما معبأة بلوب ثنائي داخل MessagePack الحمولات. هذا المقال يغطي:

Post 2 — محاكاة قاعدة بيانات متجهات

ملف: simulate_vectorDB.pl

قبل أن نتمكن من البحث في قاعدة بيانات نحتاج إلى واحدة. هذا المنشور يظهر:

آخر 3 — قياس: timing_DB الوحدة النمطية

ملف: timing_DB.pm

تتطلب مطالبات الأداء قياسًا. يقدم هذا المنشور:

Post 4 — K-Means تجميع مع PDL::الإحصائيات::Kmeans

ملف: kmeans.pl

K-means clustering هو العمود الفقري لنهج مؤشر الملف المقلوب (IVF) لتقريب أقرب بحث جار. هذا المقال يغطي:

Post 5 — Mini-Batch K-Means: التوسع إلى مجموعات البيانات الكبيرة

ملف: compare_kmeans_centroids.pl

يتطلب k-means الكامل كل البيانات في الذاكرة لكل تكرار. مجموعة صغيرة k يعني يتداول كمية صغيرة من دقة سنترويد لانخفاض كبير في الذاكرة والحوسبة. هذا المقال يستكشف:

Post 6 — Inverted File Index (IVF) بحث

ملف: compare_ivf_search.pl

مع سنترويد في متناول اليد يمكننا تقسيم قاعدة البيانات وإجراء خط فرعي تقريبي أقرب بحث الجوار. هذا المقال يغطي:

Post 7 — التحقق ضد R: التصحيح العددي وخطوط الأنابيب عبر اللغات

الملفات: compare_kmeans_centroids.R, compare_kmeans_centroids_pure.R, plot_centroid_coordinates.R

آخر مشاركة في سلسلة الأساس يغلق حلقة بين بيرل وR:


التالي — نشر 1: التسلسل وI / O مع VectorIO.pm


تحتوي وحدات المعالجة المركزية الحديثة على مستويات متعددة من الذاكرة السريعة على الشريحة تسمى الذاكرة الوسيطة (L1، L2، L3) التي تقع بين أنوية المعالج وذاكرة الوصول العشوائي الرئيسية. L1 هو الأصغر (عادة 32-64 كيلوبايت لكل نواة) والأسرع (زمن انتقال دورات الساعة 1-4)؛ L2 أكبر (256 كيلوبايت - 1 ميغابايت) وأبطأ قليلاً؛ تتم مشاركة L3 عبر النوى (4-64 ميغابايت) مع زمن انتقال أعلى لا يزال. تجلس ذاكرة الوصول العشوائي الرئيسية بعيدًا عن زمن الوصول من 60 إلى 100 ns - أبطأ بمقدار 200 × تقريبًا من L1.

عندما تمس الحوسبة الذاكرة بنمط متجاور يمكن التنبؤ به، يمكن للجهاز prefetcher تحميل البيانات القادمة إلى L1/L2 قبل الحاجة إليها، مما يحقق إنتاجية قريبة من الذروة. تهزم عملية مسح المؤشرات المتفرقة (مثل اجتياز صفيف Perl من عمليات المسح المخصصة للكومة) عملية السحب المسبق، مما يؤدي إلى إيقاف وحدة المعالجة المركزية (CPU) أثناء انتظار حل كل خطأ في ذاكرة التخزين المؤقت من ذاكرة الوصول العشوائي (RAM).