قاعدة بيانات KDB+: من التمويل إلى الفورمولا 1

KDB+، منتج الشركة KX هي قاعدة بيانات عمودية معروفة على نطاق واسع في الدوائر الضيقة، وسريعة للغاية، ومصممة لتخزين السلاسل الزمنية والحسابات التحليلية بناءً عليها. في البداية، كانت (ولا تزال) تحظى بشعبية كبيرة في الصناعة المالية - حيث تستخدمها جميع البنوك الاستثمارية العشرة الكبرى والعديد من صناديق التحوط والبورصات والمنظمات الأخرى المعروفة. قررت KX مؤخرًا توسيع قاعدة عملائها وتقدم الآن حلولاً في مجالات أخرى حيث توجد كمية كبيرة من البيانات، منظمة حسب الوقت أو غير ذلك - الاتصالات والمعلوماتية الحيوية والتصنيع وما إلى ذلك. كما أصبحوا شريكًا لفريق Aston Martin Red Bull Racing في الفورمولا 10، حيث يساعدون في جمع ومعالجة البيانات من أجهزة استشعار السيارة وتحليل اختبارات نفق الرياح. في هذه المقالة، أريد أن أخبرك ما هي ميزات KDB+ التي تجعله فائق الأداء، ولماذا ترغب الشركات في إنفاق الكثير من المال عليه، وأخيرًا، لماذا لا يعد قاعدة بيانات حقًا.
 
قاعدة بيانات KDB+: من التمويل إلى الفورمولا 1
 
سأحاول في هذه المقالة أن أخبرك بشكل عام ما هو KDB+، وما هي الإمكانيات والقيود التي يتمتع بها، وما هي فوائده للشركات التي ترغب في معالجة كميات كبيرة من البيانات. لن أخوض في تفاصيل تطبيق KDB+ أو تفاصيل لغة برمجة Q. كلا الموضوعين واسعان جدًا ويستحقان مقالات منفصلة. يمكن العثور على الكثير من المعلومات حول هذه المواضيع على موقع code.kx.com، بما في ذلك كتاب عن Q - Q For Mortals (انظر الرابط أدناه).

بعض المصطلحات

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

 

المعلومات التاريخية

تأسست KX في عام 1993 على يد آرثر ويتني، الذي عمل سابقًا في بنك مورجان ستانلي على لغة A+، التي خلفت APL - وهي لغة أصلية للغاية وكانت ذات يوم شعبية في عالم المال. بالطبع، في KX، استمر آرثر بنفس الروح وأنشأ لغة K المتجهة الوظيفية، مسترشدًا بأفكار التبسيط الجذري. تبدو برامج K وكأنها مزيج من علامات الترقيم والأحرف الخاصة، ويعتمد معنى العلامات والوظائف على السياق، وكل عملية تحمل معنى أكثر بكثير مما تحمله في لغات البرمجة التقليدية. ونتيجة لذلك، يشغل برنامج K الحد الأدنى من المساحة — يمكن لبضعة أسطر أن تحل محل صفحات النص في لغة مطولة مثل Java — وهو تطبيق فائق التركيز للخوارزمية.
 
دالة في لغة K تنفذ معظم مولد المحلل اللغوي LL1 وفقًا لقواعد معينة:

1. pp:{q:{(x;p3(),y)};r:$[-11=@x;$x;11=@x;q[`N;$*x];10=abs@@x;q[`N;x]  
2.   ($)~*x;(`P;p3 x 1);(1=#x)&11=@*x;pp[{(1#x;$[2=#x;;,:]1_x)}@*x]  
3.      (?)~*x;(`Q;pp[x 1]);(*)~*x;(`M;pp[x 1]);(+)~*x;(`MP;pp[x 1]);(!)~*x;(`Y;p3 x 1)  
4.      (2=#x)&(@x 1)in 100 101 107 7 -7h;($[(@x 1)in 100 101 107h;`Ff;`Fi];p3 x 1;pp[*x])  
5.      (|)~*x;`S,(pp'1_x);2=#x;`C,{@[@[x;-1+#x;{x,")"}];0;"(",]}({$[".s.C"~4#x;6_-2_x;x]}'pp'x);'`pp];  
6.   $[@r;r;($[1<#r;".s.";""],$*r),$[1<#r;"[",(";"/:1_r),"]";""]]}  

 جسد آرثر فلسفة الكفاءة القصوى مع الحد الأدنى من حركات الجسم في KDB+، والتي ظهرت في عام 2003 (أعتقد أنه أصبح من الواضح الآن من أين يأتي الحرف K في الاسم) وهو ليس أكثر من مجرد مترجم للإصدار الرابع من K اللغة تمت إضافة إصدار أكثر سهولة في الاستخدام أعلى KK يسمى Q. كما أضاف Q دعمًا لهجة معينة من SQL - QSQL، والمترجم - دعم الجداول كنوع بيانات النظام، وأدوات العمل مع الجداول في الذاكرة وعلى القرص، الخ.
 
لذلك، من وجهة نظر المستخدم، يعد KDB+ مجرد مترجم للغة Q مع دعم للجداول وتعبيرات نمط LINQ المشابهة لـ SQL من C#. هذا هو الفرق الأكثر أهمية بين KDB+ وقواعد البيانات الأخرى وميزته التنافسية الرئيسية، والتي غالبًا ما يتم التغاضي عنها. هذه ليست قاعدة بيانات + لغة مساعدة معطلة، ولكنها لغة برمجة قوية كاملة + دعم مدمج لوظائف قاعدة البيانات. سيلعب هذا التمييز دورًا حاسمًا في سرد ​​جميع مزايا KDB+. على سبيل المثال…
 

القياس

وفقًا للمعايير الحديثة، فإن KDB+ هو ببساطة حجم مجهري. إنه حرفيًا ملف قابل للتنفيذ بسعة فرعية واحدة وملف نصي صغير يحتوي على بعض وظائف النظام. في الواقع - أقل من واحد ميغا بايت، ولهذا البرنامج تدفع الشركات عشرات الآلاف من الدولارات سنوياً مقابل معالج واحد على الخادم.

  • يسمح هذا الحجم لـ KDB+ بالشعور بالروعة على أي جهاز - بدءًا من كمبيوتر Pi الصغير وحتى الخوادم ذات الذاكرة التي تبلغ تيرابايت. لا يؤثر هذا على الوظيفة بأي شكل من الأشكال، علاوة على ذلك، تبدأ لغة Q على الفور، مما يسمح باستخدامها، من بين أشياء أخرى، كلغة برمجة نصية.
  • وبهذا الحجم، يتناسب مترجم Q تمامًا مع ذاكرة التخزين المؤقت للمعالج، مما يؤدي إلى تسريع تنفيذ البرنامج.
  • مع هذا الحجم من الملف القابل للتنفيذ، تشغل عملية Q مساحة ضئيلة في الذاكرة؛ يمكنك تشغيل المئات منها. علاوة على ذلك، إذا لزم الأمر، يمكن لـ Q العمل بعشرات أو مئات الجيجابايت من الذاكرة ضمن عملية واحدة.

الشمولية

يعتبر Q رائعًا لمجموعة واسعة من التطبيقات. يمكن أن تعمل العملية Q كقاعدة بيانات تاريخية وتوفر وصولاً سريعًا إلى تيرابايت من المعلومات. على سبيل المثال، لدينا العشرات من قواعد البيانات التاريخية، في بعضها، يستهلك يوم واحد غير مضغوط من البيانات أكثر من 100 غيغابايت. ومع ذلك، ضمن قيود معقولة، سيتم إكمال الاستعلام إلى قاعدة البيانات خلال عشرات إلى مئات من المللي ثانية. بشكل عام، لدينا مهلة عالمية لطلبات المستخدم - 30 ثانية - وهي تعمل نادرًا جدًا.
 
يمكن أن تكون Q قاعدة بيانات في الذاكرة بنفس السهولة. تتم إضافة البيانات الجديدة إلى جداول الذاكرة بسرعة كبيرة بحيث تكون طلبات المستخدم هي العامل المحدد. يتم تخزين البيانات الموجودة في الجداول في أعمدة، مما يعني أن أي عملية على عمود ستستخدم ذاكرة التخزين المؤقت للمعالج بكامل طاقتها. بالإضافة إلى ذلك، حاول KX تنفيذ جميع العمليات الأساسية مثل الحساب من خلال تعليمات المتجهات للمعالج، مما يزيد من سرعتها. يمكن لـ Q أيضًا تنفيذ مهام غير نموذجية لقواعد البيانات - على سبيل المثال، معالجة البيانات المتدفقة والحساب في "الوقت الفعلي" (مع تأخير من عشرات المللي ثانية إلى عدة ثوانٍ اعتمادًا على المهمة) وظائف التجميع المختلفة للأدوات المالية لأوقات مختلفة فترات زمنية أو بناء نموذج لتأثير المعاملات المثالية على السوق وتنفيذ ملفات التعريف الخاصة بها على الفور تقريبًا بعد اكتمالها. في مثل هذه المهام، غالبًا ما لا يكون التأخير الزمني الرئيسي هو Q، ولكن الحاجة إلى مزامنة البيانات من مصادر مختلفة. يتم تحقيق السرعة العالية نظرًا لأن البيانات والوظائف التي تعالجها موجودة في عملية واحدة، ويتم تقليل المعالجة إلى تنفيذ عدة تعبيرات وروابط QSQL، والتي لا يتم تفسيرها، ولكن يتم تنفيذها بواسطة كود ثنائي.
 
أخيرًا، يمكنك كتابة أي عمليات خدمة في Q. على سبيل المثال، تقوم البوابة بمعالجة توزيع طلبات المستخدم تلقائيًا على قواعد البيانات والخوادم الضرورية. يتمتع المبرمج بالحرية الكاملة لتنفيذ أي خوارزمية للموازنة وتحديد الأولويات والتسامح مع الأخطاء وحقوق الوصول والحصص وأي شيء آخر يرغب فيه قلبه. المشكلة الرئيسية هنا هي أنه سيتعين عليك تنفيذ كل هذا بنفسك.
 
على سبيل المثال، سأدرج أنواع العمليات لدينا. يتم استخدامها جميعًا بشكل نشط وتعمل معًا، وتجمع العشرات من قواعد البيانات المختلفة في قاعدة واحدة، وتعالج البيانات من مصادر متعددة وتخدم مئات المستخدمين والتطبيقات.

  • الموصلات (معالج التغذية) لمصادر البيانات. تستخدم هذه العمليات عادةً مكتبات خارجية يتم تحميلها في Q. واجهة C في Q بسيطة للغاية وتسمح لك بسهولة إنشاء وظائف وكيل لأي مكتبة C/C++. Q سريع بما يكفي للتعامل، على سبيل المثال، مع سيل من رسائل FIX من جميع البورصات الأوروبية في وقت واحد.
  • موزعو البيانات (Tickerplant)، والتي تعمل كحلقة وصل وسيطة بين الموصلات والمستهلكين. وفي الوقت نفسه، يقومون بكتابة البيانات الواردة إلى سجل ثنائي خاص، مما يوفر المتانة للمستهلكين ضد فقدان الاتصال أو إعادة التشغيل.
  • قاعدة بيانات في الذاكرة (rdb). توفر قواعد البيانات هذه أسرع وصول ممكن إلى البيانات الأولية والحديثة عن طريق تخزينها في الذاكرة. عادةً ما يقومون بتجميع البيانات في الجداول أثناء النهار وإعادة ضبطها ليلاً.
  • قاعدة البيانات المستمرة (pdb). تضمن قواعد البيانات هذه تخزين بيانات اليوم في قاعدة بيانات تاريخية. كقاعدة عامة، على عكس rdb، لا يقومون بتخزين البيانات في الذاكرة، ولكنهم يستخدمون ذاكرة تخزين مؤقت خاصة على القرص خلال النهار وينسخون البيانات في منتصف الليل إلى قاعدة البيانات التاريخية.
  • قواعد البيانات التاريخية (HDB). توفر قواعد البيانات هذه إمكانية الوصول إلى البيانات الخاصة بالأيام والأشهر والسنوات السابقة. يقتصر حجمها (بالأيام) فقط على حجم محركات الأقراص الثابتة. يمكن وضع البيانات في أي مكان، خاصة على أقراص مختلفة لتسريع الوصول إليها. من الممكن ضغط البيانات باستخدام عدة خوارزميات للاختيار من بينها. هيكل قاعدة البيانات موثق جيدًا وبسيط، ويتم تخزين البيانات عمودًا تلو الآخر في ملفات عادية، بحيث يمكن معالجتها، بما في ذلك عن طريق نظام التشغيل.
  • قواعد البيانات مع المعلومات المجمعة. يقومون بتخزين مجموعات مختلفة، عادة مع، مجمعة حسب اسم الأداة والفاصل الزمني. تقوم قواعد البيانات الموجودة في الذاكرة بتحديث حالتها مع كل رسالة واردة، وتقوم قواعد البيانات التاريخية بتخزين البيانات المحسوبة مسبقًا لتسريع الوصول إلى البيانات التاريخية.
  • وأخيرا، عمليات البوابةخدمة التطبيقات والمستخدمين. يسمح لك Q بتنفيذ معالجة غير متزامنة تمامًا للرسائل الواردة، وتوزيعها عبر قواعد البيانات، والتحقق من حقوق الوصول، وما إلى ذلك. لاحظ أن الرسائل ليست محدودة وفي أغلب الأحيان لا تكون تعبيرات SQL، كما هو الحال في قواعد البيانات الأخرى. في أغلب الأحيان، يتم إخفاء تعبير SQL في وظيفة خاصة ويتم إنشاؤه بناءً على المعلمات التي يطلبها المستخدم - يتم تحويل الوقت وتصفيته وتطبيع البيانات (على سبيل المثال، يتم تسوية سعر السهم إذا تم دفع الأرباح)، وما إلى ذلك.

البنية النموذجية لنوع بيانات واحد:

قاعدة بيانات KDB+: من التمويل إلى الفورمولا 1

سرعة

على الرغم من أن Q هي لغة مفسرة، إلا أنها أيضًا لغة متجهة. وهذا يعني أن العديد من الوظائف المضمنة، وخاصة الحسابية، تأخذ وسيطات من أي شكل - أرقام، ناقلات، مصفوفات، قوائم - ومن المتوقع من المبرمج أن ينفذ البرنامج كعمليات مصفوفة. في مثل هذه اللغة، إذا قمت بإضافة متجهين لمليون عنصر، فلن يعد من المهم تفسير اللغة؛ سيتم تنفيذ الإضافة بواسطة وظيفة ثنائية محسنة للغاية. نظرًا لأن حصة الأسد من الوقت في برامج Q يتم إنفاقها على العمليات باستخدام الجداول التي تستخدم هذه الوظائف الموجهة الأساسية، فإن الإخراج هو سرعة تشغيل مناسبة جدًا، مما يسمح لنا بمعالجة كمية هائلة من البيانات حتى في عملية واحدة. هذا مشابه للمكتبات الرياضية في بايثون - على الرغم من أن بايثون نفسها لغة بطيئة جدًا، إلا أنها تحتوي على العديد من المكتبات الممتازة مثل numpy التي تسمح لك بمعالجة البيانات الرقمية بسرعة اللغة المترجمة (بالمناسبة، numpy قريبة أيديولوجيًا من Q ).
 
بالإضافة إلى ذلك، اتبعت KX نهجًا دقيقًا للغاية في تصميم الجداول وتحسين العمل معها. أولاً، يتم دعم عدة أنواع من الفهارس، والتي تدعمها الوظائف المضمنة ويمكن تطبيقها ليس فقط على أعمدة الجدول، ولكن أيضًا على أي متجهات - التجميع والفرز وسمة التفرد والتجميع الخاص لقواعد البيانات التاريخية. يتم تطبيق الفهرس ببساطة ويتم ضبطه تلقائيًا عند إضافة عناصر إلى العمود/المتجه. يمكن تطبيق الفهارس بنجاح على أعمدة الجدول سواء في الذاكرة أو على القرص. عند تنفيذ استعلام QSQL، يتم استخدام الفهارس تلقائيًا إن أمكن. ثانيا، يتم العمل مع البيانات التاريخية من خلال آلية عرض ملفات نظام التشغيل (خريطة الذاكرة). لا يتم تحميل الجداول الكبيرة أبدًا في الذاكرة، وبدلاً من ذلك، يتم تعيين الأعمدة الضرورية مباشرة إلى الذاكرة ويتم تحميل الجزء المطلوب منها فقط (تساعد الفهارس هنا أيضًا). لا يهم المبرمج ما إذا كانت البيانات موجودة في الذاكرة أم لا، فآلية العمل مع mmap مخفية تمامًا في أعماق Q.
 
KDB+ ليست قاعدة بيانات علائقية؛ يمكن أن تحتوي الجداول على بيانات عشوائية، في حين أن ترتيب الصفوف في الجدول لا يتغير عند إضافة عناصر جديدة ويمكن، بل ويجب، استخدامه عند كتابة الاستعلامات. هناك حاجة ماسة إلى هذه الميزة للعمل مع السلاسل الزمنية (البيانات من التبادلات، والقياس عن بعد، وسجلات الأحداث)، لأنه إذا تم فرز البيانات حسب الوقت، فلن يحتاج المستخدم إلى استخدام أي حيل SQL للعثور على الصف الأول أو الأخير أو N الصفوف في الجدول، حدد السطر الذي يتبع السطر N، وما إلى ذلك. يتم تبسيط عمليات ربط الجداول بشكل أكبر، على سبيل المثال، يستغرق العثور على آخر عرض أسعار لـ 16000 معاملة VOD.L (Vodafone) في جدول يضم 500 مليون عنصر حوالي ثانية واحدة على القرص وعشرات المللي ثانية في الذاكرة.
 
مثال على الانضمام الزمني - تم تعيين جدول الاقتباس إلى الذاكرة، لذلك ليست هناك حاجة لتحديد VOD.L حيث يتم استخدام الفهرس الموجود في عمود Sym وحقيقة فرز البيانات حسب الوقت ضمنيًا. جميع الصلات في Q تقريبًا هي وظائف عادية، وليست جزءًا من تعبير محدد:

1. aj[`sym`time;select from trade where date=2019.03.26, sym=`VOD.L;select from quote where date=2019.03.26]  

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

مجموع

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

لمزيد من المعلومات،

القيود

العيب الكبير في KDB+/Q هو عتبة الدخول العالية. تحتوي اللغة على بناء جملة غريب، وبعض الوظائف مثقلة بشكل كبير (القيمة، على سبيل المثال، لديها حوالي 11 حالة استخدام). والأهم من ذلك أنه يتطلب نهجا مختلفا جذريا لكتابة البرامج. في لغة المتجهات، يجب عليك دائمًا التفكير فيما يتعلق بتحويلات المصفوفة، وتنفيذ جميع الحلقات من خلال العديد من المتغيرات لوظائف الخريطة/التقليل (والتي تسمى الظروف في Q)، ولا تحاول أبدًا توفير المال عن طريق استبدال عمليات المتجهات بعمليات ذرية. على سبيل المثال، للعثور على فهرس التكرار N لعنصر في مصفوفة، يجب عليك كتابة:

1. (where element=vector)[N]  

على الرغم من أن هذا يبدو غير فعال إلى حد كبير وفقًا لمعايير C/Java (= ينشئ متجهًا منطقيًا، حيث يُرجع الفهارس الحقيقية للعناصر الموجودة فيه). لكن هذا الترميز يجعل معنى التعبير أكثر وضوحًا ويمكنك استخدام عمليات المتجهات السريعة بدلاً من العمليات الذرية البطيئة. إن الاختلاف المفاهيمي بين لغة المتجهات وغيرها يشبه الفرق بين الأساليب الحتمية والوظيفية للبرمجة، ويجب أن تكون مستعدًا لذلك.
 
بعض المستخدمين أيضًا غير راضين عن QSQL. النقطة المهمة هي أنها تبدو مثل SQL الحقيقي فقط. في الواقع، إنه مجرد مترجم للتعبيرات المشابهة لـ SQL ولا يدعم تحسين الاستعلام. يجب على المستخدم أن يكتب بنفسه الاستعلامات المثالية، وفي Q، والتي ليس الكثيرون مستعدين لها. من ناحية أخرى، بالطبع، يمكنك دائمًا كتابة الاستعلام الأمثل بنفسك، بدلاً من الاعتماد على مُحسِّن الصندوق الأسود.
 
كميزة إضافية، يتوفر كتاب عن Q - Q For Mortals مجانًا على موقع الشركة، هناك أيضًا الكثير من المواد المفيدة الأخرى التي تم جمعها هناك.
 
عيب كبير آخر هو تكلفة الترخيص. وهذا يعني عشرات الآلاف من الدولارات سنويًا لكل وحدة معالجة مركزية. فقط الشركات الكبيرة يمكنها تحمل مثل هذه النفقات. في الآونة الأخيرة، جعلت KX سياسة الترخيص الخاصة بها أكثر مرونة وتوفر الفرصة للدفع فقط مقابل وقت الاستخدام أو استئجار KDB+ في سحابتي Google وAmazon. كما يقدم KX للتنزيل نسخة مجانية لأغراض غير تجارية (إصدار 32 بت أو 64 بت عند الطلب).
 

المنافسين

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

التكامل بايثون

لتسهيل استخدام KDB+ للأشخاص غير المعتادين على التكنولوجيا، أنشأت KX مكتبات للتكامل بشكل وثيق مع Python ضمن عملية واحدة. يمكنك إما استدعاء أي دالة بايثون من Q، أو العكس - استدعاء أي دالة Q من بايثون (على وجه الخصوص، تعبيرات QSQL). تقوم المكتبات، إذا لزم الأمر (وليس دائمًا من أجل الكفاءة)، بتحويل البيانات من تنسيق إحدى اللغات إلى تنسيق لغة أخرى. ونتيجة لذلك، يعيش Q وPython في تعايش وثيق لدرجة أن الحدود بينهما غير واضحة. ونتيجة لذلك، يتمتع المبرمج، من ناحية، بإمكانية الوصول الكامل إلى العديد من مكتبات Python المفيدة، ومن ناحية أخرى، يتلقى قاعدة سريعة للعمل مع البيانات الضخمة المدمجة في Python، وهو أمر مفيد بشكل خاص لأولئك المشاركين في التعلم الآلي أو النمذجة.
 
العمل مع Q في بايثون:

1. >>> q()  
2.q)trade:([]date:();sym:();qty:())  
3. q)  
4. >>> q.insert('trade', (date(2006,10,6), 'IBM', 200))  
5. k(',0')  
6. >>> q.insert('trade', (date(2006,10,6), 'MSFT', 100))  
7. k(',1')  

مراجع

موقع الشركة- https://kx.com/
موقع للمطورين - https://code.kx.com/v2/
كتاب Q للبشر (باللغة الإنجليزية) - https://code.kx.com/q4m3/
مقالات عن تطبيقات KDB+/Q من موظفي kx - https://code.kx.com/v2/wp/

المصدر: www.habr.com

إضافة تعليق