عنواني ليس منزل أو شارع ، عنواني هو الاتحاد السوفيتي؟

microBIGDATA أو FIAS في جيبك


بيتر بروغيل الأصغر ، دفع الضرائب ، 1640

ذهب آخر دخول على ماكينة حلاقة على الكائنات . سنواصل الاستطلاع في المعركة. اليوم سنتحدث عن صعوبة. لا يتعلق الأمر ببيانات BIG حتى الآن ، ولكنه غير مناسب بالفعل للعمل - كميات كبيرة من البيانات. لن يصلح الجميع إلى ذاكرة الوصول العشوائي بأكملها ، ولكن البعض لن يصلح حتى على القرص (لا توجد مساحة كافية ، ولكن الكثير من القمامة). اسم قاعدة بيانات FIAS للثقة الخاصة بنا هو قاعدة بيانات نظام معلومات العناوين الفيدرالي. 5.5 غيغابايت الأرشيف. ويتم ضغطه في أرشيف XML. بعد التفريغ ، سيكون هناك 53 جيجابايت كاملة (تخزين 110 جيجابايت لتفريغ). وعندما تبدأ في تحليله وتحويله ، فلن يكون 110 غيغابايت كافيًا. حول المبلغ المطلوب من ذاكرة الوصول العشوائي سيكون أيضا.

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

أو قاعدة بيانات لمشروع OpenStreetMaps المعروف إلى حد ما. تم بناؤه من قبل المتطوعين على أساس ويكيبيديا. مفصلة جدا ومتعددة اللغات. الآن أرشيف كامل من XML مضغوط بحجم 74 جيجابايت.
إذا بدأوا الحديث عن العناوين ، فقد وصلت أخبار غير متوقعة في الوقت المناسب من DuckDuckGo ، أفضل محرك بحث آمن لهذا اليوم ، حول انتقاله إلى بطاقات Apple. بتعبير أدق على Apple MapKit JS. الميزة الأكثر إثارة للاهتمام في سياقنا هي "البحث عن عنوان محسّن". هل أبل هي الأفضل في جمع وحماية بياناتنا بشق الأنفس؟ سيكون من الضروري تتبع ...
لذلك التحدي. كيفية وضع ثروة كل هذا العنوان في مستودع ممتع للاستخدام ، للسماح لك أن تحلم بواجهة برمجة تطبيقات مجانية (في بيثون ، بالطبع) وعدم السماح لخزانك الغالي بخنق تحميل غير مقروء. دعنا نسميها MicroBigData - mcBD أو μBG باللغة الإنجليزية :-)

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

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

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

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

Class Soviet.Address Extends %Persistent { Property streetName As %String; Property cityName As %String; Property areaName As %String; Property postalCode As %String; } 

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

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

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

خذ مثالا حيا. يتم تشغيل Google الآن بواسطة Sundar Pichai. هو نفسه من الهند. ولد في مدينة تشيناي (المعروف أيضا باسم تشيناي). أو في مدراس؟ في عام 1996 ، قرر الهنود أن اسم المدينة كان برتغاليًا جدًا وتمت تسميته عاصمة تاميل نادو من مدراس إلى تشيناي. وماذا يجب أن يكتب سوندر و 72 مليون من مواطنيه في مستنداته الإلكترونية؟

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

باختصار ، السياق هو الأهم. ويتيح لنا نموذج الكائن استخدامه مباشرةً من خلال تغليف "بيانات الماكينة" وتنفيذ السلوك "المباشر" الحساسة للسياق. ليس على الإطلاق أن tuples المستوى المنخفض المنصوص عليها في الجداول ؛-)

في غضون ذلك ، دعونا نعود إلى التنفيذ "البدائي" ونعقد حياتنا. للبدء ، القضاء على الأخطاء والتكرارات. أي أننا سنبحث عن طريقة لكتابة العناوين على الفور. في الوقت نفسه ، سنساعد مطوري واجهة المستخدم على تنظيم نصائح للمستخدمين عند ملء حقول إدخال البيانات.
عندما يجتمع شخصان في مكان واحد - نصوص ومنصة بيانات InterSystems IRIS ، يتمتع المطور بفرصة حقيقية للنشر بشكل كامل دون مغادرة الجهاز. على سبيل المثال ، باستخدام مكونات الكائن المدمجة iKnow و iFind . هذه هي مكونات للعمل مع البيانات غير المهيكلة والبحث عن النص الكامل ، على التوالي. ويدعم الروسية "خارج منطقة الجزاء".
أول الأشياء أولاً ، سنقوم بتعليم العنوان قراءة البيانات اللازمة من المصدر الأصلي. لحسن الحظ ، تحتوي مجموعة بيانات خدمة الضرائب الفيدرالية على أوصاف جاهزة لهيكل مستندات XML. وفقًا للوصف المرفق بالبيانات من موقع FIAS على الويب ، نحتاج إلى مجموعة بيانات ADDROBJ ، والتي ، في حالتي ، تتوافق مع الملف AS_ADDROBJ_2_250_01_04_01_01.xsd

بعد ذلك ، سوف نستخدم محول النظام لقالب XSD إلى بنية الحقل المقابل لفئة٪ XML. Adaptor ، التي أعدت لنا من قبل مطوري IRIS. علامة النسبة المئوية في البداية تعني فقط أن هذه فئة من مكتبة النظام. تفاصيل الاستخدام موجودة في الوثائق . سوف نقوم بالعمليات في المحطة.

 set xmlScheme = ##class(%XML.Utils.SchemaReader).%New() do xmlScheme.Process("http://localhost/AS_ADDROBJ_2_250_01_04_01_01.xsd") 

يمكن الحصول على الشيء نفسه في Atelier IDE (في أدوات> الوظائف الإضافية> قائمة معالج مخطط XML) أو عن طريق طلبات مماثلة للكائنات مباشرة من رمز البرنامج.



نظرًا لأننا استخدمنا المُنشئ دون تحديد المعلمات ، أي اسم الحزمة لوضع الفئات الناتجة ، فقد انتهى بها الأمر في حزمة الاختبار. كما ترون من الأمر الثاني ، أعطيت ملف المخطط من خلال خادم الويب المحلي في بيثون:

 python3 -m http.server 80 

يمكنك استخدام أي خادم HTTP آخر تريده. أو قم بتحميل الملف إلى خادم IRIS الخاص بك وأشير إلى المسار المباشر إليه.

نتيجة لذلك ، لدينا فصلان يعكسان تمامًا هيكل XML القابل للتوجيه:

Test.AddressObjects
 ///            Class Test.AddressObjects Extends (%Persistent, %XML.Adaptor) [ ProcedureBlock ] { Parameter XMLNAME = "AddressObjects"; Parameter XMLSEQUENCE = 1; ///    Relationship Object As Test.Object(XMLNAME = "Object", XMLPROJECTION = "ELEMENT") [ Cardinality = many, Inverse = AddressObjects ]; } 

اختبار
 ///  : http://localhost:28869/AS_ADDROBJ_2_250_01_04_01_01.xsd Class Test.Object Extends (%Persistent, %XML.Adaptor) [ ProcedureBlock ] { Parameter XMLNAME = "Object"; Parameter XMLSEQUENCE = 1; ///      Property AOGUID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "AOGUID", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property FORMALNAME As %String(MAXLEN = 120, MINLEN = 1, XMLNAME = "FORMALNAME", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property REGIONCODE As %String(MAXLEN = 2, MINLEN = 2, XMLNAME = "REGIONCODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property AUTOCODE As %String(MAXLEN = 1, MINLEN = 1, XMLNAME = "AUTOCODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property AREACODE As %String(MAXLEN = 3, MINLEN = 3, XMLNAME = "AREACODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property CITYCODE As %String(MAXLEN = 3, MINLEN = 3, XMLNAME = "CITYCODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///    Property CTARCODE As %String(MAXLEN = 3, MINLEN = 3, XMLNAME = "CTARCODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///    Property PLACECODE As %String(MAXLEN = 3, MINLEN = 3, XMLNAME = "PLACECODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///     Property PLANCODE As %String(MAXLEN = 4, MINLEN = 4, XMLNAME = "PLANCODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property STREETCODE As %String(MAXLEN = 4, MINLEN = 4, XMLNAME = "STREETCODE", XMLPROJECTION = "ATTRIBUTE"); ///     Property EXTRCODE As %String(MAXLEN = 4, MINLEN = 4, XMLNAME = "EXTRCODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///      Property SEXTCODE As %String(MAXLEN = 3, MINLEN = 3, XMLNAME = "SEXTCODE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property OFFNAME As %String(MAXLEN = 120, MINLEN = 1, XMLNAME = "OFFNAME", XMLPROJECTION = "ATTRIBUTE"); ///   Property POSTALCODE As %String(MAXLEN = 6, MINLEN = 6, XMLNAME = "POSTALCODE", XMLPROJECTION = "ATTRIBUTE"); ///    Property IFNSFL As %String(MAXLEN = 4, MINLEN = 4, XMLNAME = "IFNSFL", XMLPROJECTION = "ATTRIBUTE"); ///      Property TERRIFNSFL As %String(MAXLEN = 4, MINLEN = 4, XMLNAME = "TERRIFNSFL", XMLPROJECTION = "ATTRIBUTE"); ///    Property IFNSUL As %String(MAXLEN = 4, MINLEN = 4, XMLNAME = "IFNSUL", XMLPROJECTION = "ATTRIBUTE"); ///      Property TERRIFNSUL As %String(MAXLEN = 4, MINLEN = 4, XMLNAME = "TERRIFNSUL", XMLPROJECTION = "ATTRIBUTE"); /// OKATO Property OKATO As %String(MAXLEN = 11, MINLEN = 11, XMLNAME = "OKATO", XMLPROJECTION = "ATTRIBUTE"); /// OKTMO Property OKTMO As %String(MAXLEN = 11, MINLEN = 8, XMLNAME = "OKTMO", XMLPROJECTION = "ATTRIBUTE"); ///    Property UPDATEDATE As %Date(XMLNAME = "UPDATEDATE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///     Property SHORTNAME As %String(MAXLEN = 10, MINLEN = 1, XMLNAME = "SHORTNAME", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///    Property AOLEVEL As %Integer(XMLNAME = "AOLEVEL", XMLPROJECTION = "ATTRIBUTE", XMLTotalDigits = 10) [ Required ]; ///     Property PARENTGUID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "PARENTGUID", XMLPROJECTION = "ATTRIBUTE"); ///   .  . Property AOID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "AOID", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///        Property PREVID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "PREVID", XMLPROJECTION = "ATTRIBUTE"); ///        Property NEXTID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "NEXTID", XMLPROJECTION = "ATTRIBUTE"); ///           4.0. Property CODE As %String(MAXLEN = 17, MINLEN = 0, XMLNAME = "CODE", XMLPROJECTION = "ATTRIBUTE"); ///      4.0      (  ) Property PLAINCODE As %String(MAXLEN = 15, MINLEN = 0, XMLNAME = "PLAINCODE", XMLPROJECTION = "ATTRIBUTE"); ///     .     .      . /// 0 –   /// 1 -  Property ACTSTATUS As %Integer(XMLNAME = "ACTSTATUS", XMLPROJECTION = "ATTRIBUTE", XMLTotalDigits = 10) [ Required ]; ///   Property CENTSTATUS As %Integer(XMLNAME = "CENTSTATUS", XMLPROJECTION = "ATTRIBUTE", XMLTotalDigits = 10) [ Required ]; ///     –    (.   OperationStatus): /// 01 – ; /// 10 – ; /// 20 – ; /// 21 –  ; /// 30 – ; /// 31 -     ; /// 40 –    (); /// 41 –     ; /// 42 -        ; /// 43 -         ; /// 50 – ; /// 51 –     ; /// 60 –    ; /// 61 –        Property OPERSTATUS As %Integer(XMLNAME = "OPERSTATUS", XMLPROJECTION = "ATTRIBUTE", XMLTotalDigits = 10) [ Required ]; ///    4 (    ) Property CURRSTATUS As %Integer(XMLNAME = "CURRSTATUS", XMLPROJECTION = "ATTRIBUTE", XMLTotalDigits = 10) [ Required ]; ///    Property STARTDATE As %Date(XMLNAME = "STARTDATE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///    Property ENDDATE As %Date(XMLNAME = "ENDDATE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///      Property NORMDOC As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "NORMDOC", XMLPROJECTION = "ATTRIBUTE"); ///     Property LIVESTATUS As %xsd.byte(VALUELIST = ",0,1", XMLNAME = "LIVESTATUS", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///  : /// 0 -   /// 1 - ; /// 2 - - Property DIVTYPE As %xsd.int(VALUELIST = ",0,1,2", XMLNAME = "DIVTYPE", XMLPROJECTION = "ATTRIBUTE") [ Required ]; Relationship AddressObjects As Test.AddressObjects(XMLPROJECTION = "NONE") [ Cardinality = one, Inverse = Object ]; } 


من القائمة الكاملة لملفات xml في FIAS ، سنستخدم ملفًا فقط مع أسماء المناطق والمدن والشوارع. في وقت إعداد المنشور ، كان لدي هذا:
AS_ADDROBJ_20190106_90809714-fe22-45b2-929c-52bd950963e0.XML

حجم الملف ليس كبيرًا ولا صغيرًا ، ولكن حجمه 3 غيغابايت تقريبًا. لن تفتحها بأدوات نصية عادية - فهي لا تستوعب هذا الحجم.
بالمناسبة ، لا يتجاوز الحد الأقصى لطول السلسلة الحرفية (نوع السلسلة) في InterSystems IRIS 3،641،144 حرفًا. وهذا يعني أن تنزيل الملف مباشرة أو فشل عنوان URL فيه. قيود أخرى يمكن العثور عليها في الوثائق . للعمل مع كميات كبيرة من البيانات ، يمكنك استخدام تدفقات البيانات (التدفقات) التي ليس لها حد طول معين.
دعونا نرى ما نحصل عليه؟

الطبخ FIAS محشوة الفلفل. هذه ليست سوى استعداد لمستقبل رائع. أولاً نحصل على الحد الأدنى المبدئي للمجموعة. نحن بحاجة فقط هذه المكونات:

 Class FIAS.AddressObject Extends (%Persistent, %XML.Adaptor) [ ProcedureBlock ] { Parameter XMLNAME = "Object"; Parameter XMLSEQUENCE = 1; ///      Property AOGUID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "AOGUID", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///   Property OFFNAME As %String(MAXLEN = 120, MINLEN = 1, XMLNAME = "OFFNAME", XMLPROJECTION = "ATTRIBUTE"); ///   Property POSTALCODE As %String(MAXLEN = 6, MINLEN = 6, XMLNAME = "POSTALCODE", XMLPROJECTION = "ATTRIBUTE"); ///     Property SHORTNAME As %String(MAXLEN = 10, MINLEN = 1, XMLNAME = "SHORTNAME", XMLPROJECTION = "ATTRIBUTE") [ Required ]; ///    Property AOLEVEL As %Integer(XMLNAME = "AOLEVEL", XMLPROJECTION = "ATTRIBUTE", XMLTotalDigits = 10) [ Required ]; ///     Property PARENTGUID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "PARENTGUID", XMLPROJECTION = "ATTRIBUTE"); ///   .  . Property AOID As %String(MAXLEN = 36, MINLEN = 36, XMLNAME = "AOID", XMLPROJECTION = "ATTRIBUTE") [ Required ]; 

بعد ذلك ، قم بالكتابة . نقوم بإنشاء كائن يفهم XML على أنه أصلي - نستخدم فئة من مكتبة نظام٪ XML.Reader:

 set reader = ##class(%XML.Reader).%New() 

ونعطيه تعليمات ، من يأخذها ، ويتجاهل الباقي. سوف نأخذ وجبة واحدة:

 do reader.Correlate("Object","FIAS.AddressObject") 

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

 set url="http://localhost/AS_ADDROBJ_20190106_90809714-fe22-45b2-929c-52bd950963e0.XML" write reader.OpenUrl(url) 

مهم! في هذه اللحظة ، فإن الأغلبية التي ستنقل هذا المثال على أنفسهم سيكون لها شيء فظيع. سيعود النظام بدلاً من البهجة "1" (كل شيء على ما يرام) ، شيء يبدأ بـ "0 ¸ STORE ...". وانها لن ترضى. بمعنى أن الملف ذو قاعدة microbase على ما يبدو ليس دقيقًا جدًا ولا يتلاءم مع موضوعنا. الذاكرة المخصصة له لم تكن كافية. قابلة للحل؟ بالطبع تتيح لك منصة بيانات IRIS إنشاء كائنات تصل إلى 4 تيرابايت في ذاكرة الوصول العشوائي. ثم ما الخطأ الذي حدث؟ بشكل افتراضي ، يتم ضبط إعدادات النظام على 256 ميغابايت لكل كائن. ونحن بحاجة إلى أكثر من ذلك بكثير. وتذكر ، هذه هي متطلبات ذاكرة الوصول العشوائي. هل هناك مخزون كاف على جهاز الكمبيوتر / الخادم الخاص بك؟
ما حجم الذاكرة التي نحتاجها لتثبيت هذا العملاق الذي قمنا بتثبيته تجريبياً - حوالي 10 جيجابايت. ما تحتاج إلى تحديده في الإعدادات (القائمة> تكوين الذاكرة> الحد الأقصى للذاكرة لكل عملية (KB)) أو عبر متغير النظام $ ZSTORAGE (بالكيلوبايت):

 set $ZSTORAGE=10000000 

بدأت عملية جديدة مع إعدادات الذاكرة اللازمة؟ ثم كل شيء بسيط للغاية - نقرأ ونوفر.

يوجد خيار بديل (وربما المفضل) - استخدم خاصية UsePPGHandler لفئة٪ XML.Reader التي تتيح لك عدم تخزين XML في الذاكرة ويعمل مع إعدادات الذاكرة القياسية.

 set reader = ##class(%XML.Reader).%New() set reader.UsePPGHandler = 1 

المزيد ... الارتباط / القراءة ، إلخ. ...

 do reader.Next(.object) do object.%Save() 

وهكذا 3722.548 مرة لكل عملية :-)

هذا متعب. لذلك ، نحن نضيف فئة FIAS.AddressObject الخاصة بنا بطريقة للاستيراد ، بناءً على الأوامر الموضحة للتو:

 ClassMethod Import() { //     XML Set reader = ##class(%XML.Reader).%New() //   XML   Set status = reader.OpenURL("http://localhost/AS_ADDROBJ_20190106_90809714-fe22-45b2-929c-52bd950963e0.XML") If $$$ISERR(status) {Do $System.Status.DisplayError(status)} //       Do reader.Correlate("Object","FIAS.AddressObject") //       While (reader.Next(.object,.status)) { Set status = object.%Save() If $$$ISERR(status) {do $System.Status.DisplayError(status)} } //      ,   If $$$ISERR(status) {Do $System.Status.DisplayError(status)} } 

دعنا نستخدم قوة exocortex للكمبيوتر - أمر واحد فقط في الجهاز :

 do ##class(FIAS.AddressObject).Import() 



أسأل الجميع إلى الطاولة. كان هناك MCD ، والآن الطبق النهائي في شكل عالمي بأسماء التحقق من المدن الروسية والأوزان جاهزة.



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

علاوة على ذلك ، حول كائنات ObjectScript الجميلة القابلة للعنونة وواجهة برمجة التطبيقات في Python لم تكن مناسبة. سيكون هناك قصة منفصلة.
Pleasant: Gartner قد أنهى للتو المجموعة السنوية من تقييمات المستخدمين الحقيقيين واستعراضاتهم في فئة نظم إدارة قواعد البيانات ، وعلى هذا الأساس نشر تصنيفه لأفضل نظم إدارة قواعد البيانات لعام 2019. حصلت منتجات InterSystems Caché و InterSystems IRIS Data Platform على أعلى تصنيف لاختيار المستهلك. من الذي اخترته وكيف قمت بتصنيفه ، يمكنك إلقاء نظرة بنفسك .
أفضل برامج أنظمة إدارة قواعد البيانات التشغيلية لعام 2019 كما استعرضها العملاء

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


All Articles