भाग I InterSystems GlobalsDB .Net - हुड के नीचे peering के साथ टोही लड़ाई

छवि
अंत में, समझाने के बजाय, थोड़ी देर प्रतीक्षा करें, प्रश्न "क्या Microsoft .Net के तहत InterSystems GlobalsDB / Caché चरम है?" सकारात्मक में उत्तर दिया जा सकता है। Caché 2012.2 (फ़ील्ड टेस्ट) और GlobalsDB v2012.296 के नए संस्करण ने इस प्लेटफ़ॉर्म के लिए समर्थन पेश किया।
मैं उस शैली में प्रयास करूंगा जो एक छठी सुशी शैली पर कई डेवलपर्स के लिए पसंदीदा है, अर्थात्, स्थापित किए गए नोट्स और अन्य चीजों को पढ़े बिना, यह पता लगाने के लिए कि वास्तव में, विंडोज के लिए ग्लोबल्सबीडी वितरण का प्रतिनिधित्व करता है।

विंडोज और .Net के लिए वितरण डाउनलोड करें। हमें 25 मेगाबाइट का आकार globals_setup_2012.296.exe मिलता है। InstallShield इंस्टॉलर शुरू होता है। मैंने इसे मैक 7 एक्स के तहत वीएमवेयर फ्यूजन में काम करते हुए विंडोज 7x64 के तहत एडमिनिस्ट्रेटर मोड में शुरू नहीं किया।

स्थापना अनुमानित थी, मैंने होम डायरेक्टरी के रूप में C: \ usr \ isc \ globals निर्दिष्ट किया। प्रयोग की शुद्धता के लिए, मुझे यह कहना होगा कि मेरे पास पहले से ही इस OS में Caché है।

मैं अध्ययन करता हूं कि क्या सेट किया गया था। \ Usr \ isc \ globals में तीन फ़ोल्डर हैं: बिन, देव, एमजीआर - मानक कैचे संरचना। बायनेरिज़ और डीबीएमएस स्वयं बिन में झूठ बोलते हैं, एमआरजी में - कॉन्फ़िगरेशन और डेटाबेस फाइलें, प्लस, महत्वपूर्ण रूप से, सिस्टम लॉग, हमारे मामले में globalsdb.log।

हम। \ देव - डेवलपर के लिए विभिन्न उपकरणों के साथ एक फ़ोल्डर में जाते हैं। हम बिन, मदद और नमूनों से मिलकर। \ Dev \ dotnet में रुचि रखते हैं। In \ Bin में InterSystems.GlobalsDB की असेंबली निहित है, जिसकी मदद से हम नमूनों में javadocs के एक chm एनालॉग को नोटिस करते हैं - एक छोटा सा उपयोग उदाहरण के साथ एक विज़ुअल स्टूडियो प्रोजेक्ट।

मैं प्रोजेक्ट पर प्रेस करता हूं। मेरा विज़ुअल स्टूडियो 10 शुरू होता है और 2008 से परियोजना को अपने स्वयं के प्रारूप में परिवर्तित करना शुरू कर देता है - इंटरसिस्टम डेवलपर्स अभी भी आठ पर बैठे हैं, हालांकि कैच की नई रिलीज़ के लिए पहले से ही .Net 4 के लिए असेंबलियां हैं। रूपांतरण सफलतापूर्वक समाप्त होता है, मैं निष्पादन के लिए डीबग लॉन्च करता हूं - और निहारना, यह एक चमत्कार है। जीत गए हैं!

मेरे आश्चर्य की बात यह है कि जावा के लिए ग्लोबाल्सबीडी के मामले में डेटाबेस को शुरू करना आवश्यक था। \ Bin \ globalsdb शुरू करना और डेटाबेस तक पहुंच के लिए पर्यावरण चर GLOBALS_HOME और PATH को मुर्गा बनाना आवश्यक था।

मैं Sysinternals Process Explorer का उपयोग करके समस्या की खोज कर रहा हूं। मुझे C: \ usr \ isc \ globalsdb (यह, वैसे, GLOBALS_HOME के ​​लिए मान है) से शुरू होने वाली छह cache.exe प्रक्रियाएं मिलती हैं। मैं अपने लॉन्च किए गए विज़ुअल स्टूडियो के वातावरण को देखता हूं - इसमें पहले से ही GLOBALS_HOME है और पथ में वांछित पथ -% GLOBALS_HOME% \ बिन है। मैं विंडोज सेवाओं की सूची को देखता हूं - मुझे ग्लोबल्सबीडी सेवा मिलती है। सामान्य तौर पर, इंस्टॉलर ने छोटी चीजों का ध्यान रखा - एक अच्छी प्रवृत्ति। वैसे,% GLOBALS_HOME% \ bin \ globalsdb के माध्यम से प्रारंभ / रोकें कमांड या स्टॉप कमांड एक सेवा की शुरुआत या रोक के बराबर है और इसके विपरीत।

खैर, कंसोल एप्लिकेशन काम करता है, हालांकि, उदाहरण के लिए ग्लोबल्सबीडी डेवलपर के परीक्षणों का एक सेट अधिक संभावना है, जो कि व्यवस्थित रूप से सत्यापित करता है कि। नेट वर्क के तहत ग्लोबल्सबीडी एपीआई विधियों के सभी अधिभार। इसलिए, एपीआई से निपटने के लिए, हम अपनी नई परियोजना बनाएंगे। उसी समय, आइए देखें कि ग्लोबल्सबीडी लेने के लिए वीएस में क्या करने की आवश्यकता है।

हम कंसोल एप्लिकेशन के लिए एक नया प्रोजेक्ट बनाते हैं। InterSystems.GlobalsDB में संदर्भ जोड़ें, जो% GLOBALS_HOME% \ dev \ dotnet \ bin में है। मेरे मामले में, यह असेंबली C: \ usr \ isc \ globals \ dev \ dotnet \ bin \ InterSystems.GlobalsDB.dll है।

using System; using System.Diagnostics; using InterSystems.Globals; namespace globals { class Program { static void Main(string[] args) { } } } 


हम गति को मापने के लिए System.Diagnostics का उपयोग करेंगे।

अब, आइए एक उदाहरण देखें कि कनेक्शन कैसे बनाया गया है और इसे हमारे कोड में स्थानांतरित करें:

 static void Main(string[] args) { Connection connection = ConnectionContext.GetConnection() connection.Close(); Console.ReadLine(); } 


हम शुरू करते हैं। अपवाद प्राप्त करें एक प्रोग्राम को एक गलत प्रारूप के साथ लोड करने का प्रयास किया गया था। सब कुछ स्पष्ट है, मेरा प्रोजेक्ट डिफ़ॉल्ट रूप से x32 द्वारा बनाता है। प्रोजेक्ट प्रॉपर्टीज पर जाएं-> x64 पर प्लेटफॉर्म टारगेट बनाएं और सेट करें। हम लॉन्च करते हैं - सब ठीक है।

आगे बढ़ें - डेटाबेस में कुछ लिखने का प्रयास करें। यह ग्लोबल्सबीडी ग्लोबल्स नामक कुछ है, या, पूर्ण नाम का उपयोग करते हुए - वैश्विक चर, अर्थात, वैश्विक कैचे चर, जो किसी विशेष डेटाबेस प्रक्रिया की स्मृति में रहने वाले स्थानीय लोगों के विपरीत, डिस्क पर रहते हैं और इस प्रकार सभी डेटाबेस कनेक्शन के लिए सुलभ हैं। । ग्लोबल्सडब में हम केवल ग्लोबल्स के साथ काम कर सकते हैं।

हर कोई ग्लोबल्स को उनके गुरुत्वाकर्षण के कारण मानता है - कोई उन्हें बहुआयामी चर कहता है, दूसरे उन्हें पेड़ों या की-वैल्यू स्टोर के रूप में देखते हैं, यह मेरे लिए उनके निकट सहयोगी सरणियों या मल्टीपॉपर के रूप में प्रतिनिधित्व करना है। यदि आप कल्पनाओं में लिप्त नहीं हैं, तो वैश्विक कैशे में डेटा भंडारण की परमाणु संरचना है (उदाहरण के लिए, संबंधपरक तालिकाओं के लिए परमाणु संरचना एक तालिका है), जिसमें एक नाम है, जिसमें नोड्स नामक तत्व शामिल हैं। प्रत्येक नोड में बाईं ओर होते हैं, जिसे एक सबस्क्रिप्ट (अक्सर एक इंडेक्स या कुंजी कहा जाता है) और दाईं ओर, जिसे वास्तव में संग्रहीत डेटा कहा जाता है, जो या तो एक साधारण प्रकार (संख्या, तार) या एक सूची हो सकती है, जिनके तत्व फिर से या तो सरल प्रकार या सूचियां हैं ।
ग्लोबल्स (छद्म-कोड) के उदाहरण।

एक। उन लोगों के लिए जो यह सोचते हैं कि यह एक महत्वपूर्ण मूल्य है या मुख्य पहुंच वाला संग्रह है:

test(1) = “some text or number limited to 3641144 bytes”
test(“any string limited to 500 bytes”) = 3.14


ख। उन लोगों के लिए जो इस पेड़ को समझते हैं:

test(1,”post”) = “root”
test(1,2,”post”) = “branch A”
test(1,3,”post”) = “branch B”


सी। एक खाली सबस्क्रिप्ट भी एक सबस्क्रिप्ट है:

test = 2

घ। सूची का उपयोग कर सारणीबद्ध डेटा संग्रहण के समान:

orders(1)=list(1001,”20.12.2012”,3,,999.99)
orders(2)=list(1002,”04.12.2012”,4,,249.99)

अब आइए डेटा को वैश्विक रूप से सहेजने का प्रयास करें। ऐसा करने के लिए, वैश्विक नाम निर्दिष्ट करें, एक नया वैश्विक नोड बनाएं, नोड (कुंजी या इंडेक्स के लिए सबस्क्रिप्ट निर्दिष्ट करें, जैसा कि आप उदाहरण से देख सकते हैं) और इस नोड में संग्रहीत डेटा। वैश्विक नोड्स के साथ काम करने के लिए, ग्लोबल्सबीडी एपीआई एनओडीआरफेरेंस क्लास की एक वस्तु का उपयोग करता है। वास्तव में, यह वैश्विक में कुछ नोड के लिए एक संकेतक है। चूंकि नोड की पहचान इसके सबस्क्रिप्ट द्वारा की जाती है, इसलिए हम मान सकते हैं कि NodeReference कुछ सबस्क्रिप्ट के लिए एक लिंक है। वैश्विक के लिए एक कड़ी, जो शुरू में सिर के नोड को इंगित करती है, हम कनेक्शन के माध्यम से प्राप्त करते हैं:

NodeReference testArray = connection.CreateNodeReference ("परीक्षण"); // वैश्विक नाम परीक्षण है

सबसे पहले, सरल NodeReference.Set () विधि का उपयोग करें। एक सामान्यीकृत रूप में, इसे NodeReference.Set (डेटा, सबस्क्रिप्ट) के रूप में लिया जा सकता है और, तदनुसार, इसके निष्पादन के बाद, हमारे पास इस तरह के डेटाबेस में एक वैश्विक नोड है:

GlobalName (सबस्क्रिप्ट) = डेटा

तो कोड इस तरह दिखता है:

  static void Main(string[] args) { Connection connection = ConnectionContext.GetConnection(); NodeReference node = connection.CreateNodeReference("test"); node.Set("some text or number limited to 3641144 bytes",1); node.Set(3.14, "any string or primitive type or several values limited to 500 bytes"); connection.Close(); Console.ReadLine(); } 

हम बाहर ले जाते हैं। हमें एक अपवाद मिलता है: कनेक्शन कॉल करने से पहले कनेक्ट करना होगा ।CreateNodeReference ()। यह सही है, हम उदाहरण कोड को देखते हैं - हम स्वयं कनेक्शन स्थापित करने के लिए जिम्मेदार हैं, न कि कारखाना। ऐसा क्यों? मुझे नहीं पता यहां आप एक बात नोटिस कर सकते हैं कि कनेक्शन के साथ बहु-थ्रेडेड कार्य से संबंधित समस्याएं हैं, और भविष्य के लिए यदि आवश्यक हो तो याद रखना महत्वपूर्ण है। कनेक्शन स्थापना जोड़ें:

अगर (कनेक्शन। कनेक्शन काट दिया ()) कनेक्शन। कनेक्ट ();

अब सब ठीक है। हम देखते हैं कि GlobalsDB API काम के लिए संकेत है। हम एक बहुआयामी सबस्क्रिप्ट के साथ काम करने के लिए उदाहरण जोड़ते हैं और दाईं ओर सबस्क्रिप्ट और डेटा के लिए सीमा मान:

  static void Main(string[] args) { Connection connection = ConnectionContext.GetConnection(); if (!connection.IsConnected()) connection.Connect(); NodeReference node = connection.CreateNodeReference("test"); node.Set("some text or number limited to 3641144 bytes",1); node.Set(3.14, "any string limited to 500 bytes"); node.Set("root",new object[2] {1,"post"}) ; node.Set("branch A",new object[3] {1,1,"post"}) ; node.Set("branch B",new object[3] {1,2,"post"}) ; node.Set(2); node.Close(); node = connection.CreateNodeReference("limit"); String longestKey = new String('k', 500); String longestValue = new String('v', 3641144); node.Set(longestValue, longestKey); connection.Close(); Console.ReadLine(); } 


कैसे देखें कि डेटाबेस में वैश्विक नोड्स का सम्मिलन हुआ? आप NodeReference पढ़ने के तरीकों में से एक का उपयोग कर सकते हैं। हालांकि, डिबगिंग के लिए, आप इस तकनीक का उपयोग कर सकते हैं, ग्लोबल्सबीडी में प्रलेखित नहीं है, लेकिन उन लोगों से परिचित हैं, जिन्होंने कैच के साथ काम किया है (विशेषकर चूंकि ग्लोबल्सबीडी डिलीवरी में अभी तक कोई प्रशासन उपयोगिताओं नहीं हैं)। तो,% GLOBALS_HOME% और कमांड लाइन पर जाएं:

 C:\usr\isc\globals\bin>cache -s ..\mgr -U Data DATA>_ 

नतीजतन, हमें डेटाबेस के लिए एक टर्मिनल सत्र मिलता है। यह क्या है यह एक मानक डेटाबेस प्रक्रिया है, जो टर्मिनल मोड में लॉन्च की गई है, जो हमें कैच ऑब्जेक्ट स्क्रिप्ट भाषा में कमांड निष्पादित करने की अनुमति देती है डेटाबेस के साथ काम करने वाली स्वतंत्र प्रक्रियाएं कैचे की उन विशेषताओं में से एक है जो आपको इसे एप्लिकेशन सर्वर के रूप में उपयोग करने की अनुमति देती है - प्रक्रियाएं शुरू करें, जहां, उदाहरण के लिए, एप्लिकेशन का उपयोगकर्ता कोड काम करेगा। GlobalsDB के मामले में, CLR प्रक्रिया जिसमें हमारा .Net कोड निष्पादित होता है, ऐसी प्रक्रिया बन जाती है।

बनाए गए नोड्स कैसे देखें? ऐसा करने के लिए, राइट (संक्षिप्त डब्ल्यू) और ज़राइट (ज़ेड) कमांड हैं। एक उदाहरण:

 DATA>zw ^test ^test=2 ^test(1)="some text or number limited to 3641144 bytes" ^test(1,1,"post")="branch A" ^test(1,2,"post")="branch B" ^test(1,"post")="root" ^test("any string limited to 500 bytes")=3.1400000000000001243 

नोड या संपूर्ण वैश्विक - किल कमांड (संक्षिप्त कश्मीर) को हटाना:
 DATA>kill ^test 

डेटा रिकॉर्डिंग:

 DATA>s ^test(1,"name") = "Athens" 

लूप में डालें:
 DATA>for i=1:1:100 { s ^test(i) = i } 


टर्मिनल से बाहर निकलना रुका हुआ कमांड है (संक्षिप्त एच):
 DATA>h C:\usr\isc\globals\bin> 

समय माप:
 DATA>s st=$zh for i=1:1:100000 { s ^test(i)=i} w $zh-st,! .064444 

अब .Net और टाइमस्टैम्प से 100,000 प्रविष्टियाँ सम्मिलित करने का प्रयास करते हैं:
  static public void testInserts(int loop) { Connection connection = ConnectionContext.GetConnection(); if (!connection.IsConnected()) connection.Connect(); NodeReference node = connection.CreateNodeReference("test"); node.Kill(); Stopwatch dbTimer = Stopwatch.StartNew(); for (int i = 0; i < loop; i++) { node.Set(i+" item", i); } dbTimer.Stop(); Console.WriteLine(dbTimer.ElapsedMilliseconds + " milliseconds to save " + loop + " items"); Console.WriteLine("It is " + dbTimer.Elapsed.Seconds + " seconds"); node.Close(); connection.Close(); } 


परीक्षणों की एक श्रृंखला के लिए परिणाम:
 for (int i = 100000; i <= 1100000; i += 200000) testInserts(i); ConnectionContext.GetConnection().Close(); 


 C:\src\globals\globals\bin\Release>.\globals.exe 430 ms to save 100000 items. 232558 records/second 1223 ms to save 300000 items. 245298 records/second 1958 ms to save 500000 items. 255362 records/second 2754 ms to save 700000 items. 254175 records/second 3559 ms to save 900000 items. 252880 records/second 4436 ms to save 1100000 items. 247971 records/second 

200,000 से अधिक रिकॉर्ड प्रति सेकंड। यह सब लॉगिंग सक्षम और लेनदेन में होता है। दूसरी ओर, डेटा बहुत नकली है। तीसरे के साथ, यह एक वर्चुअल मशीन के तहत होता है, जिसमें 5 मीटर की फ्री डिस्क स्पेस होती है। चौथे के साथ, इस तरह की गति पर सब कुछ बहुत कुछ बारीकियों पर निर्भर करता है - अभिलेखों का आकार और कुंजी की यादृच्छिकता, लेनदेन प्रवाह की तीव्रता, बैचों में प्रक्रिया करने की क्षमता, लेनदेन की आवश्यकता, आदि।

एक शुरुआत के लिए पर्याप्त - ग्लोबाल्सबीडी स्थापित है, परियोजना काम कर रही है, गति पर सामान्य निष्कर्ष बनाए गए हैं।
भविष्य में, हम वैश्विक नोड्स और नोड ट्रैवर्सल संचालन के माध्यम से नेविगेशन जैसे महत्वपूर्ण विषयों का विश्लेषण करेंगे, सूचियों, लेनदेन, काउंटर, ताले के साथ काम करेंगे। अलग-अलग, हम एक दिलचस्प सवाल पर विचार करते हैं कि कई थ्रेड्स के साथ काम करते समय GlobalsDB कैसे व्यवहार करता है।

Source: https://habr.com/ru/post/In141546/


All Articles