Alamat saya bukan rumah atau jalan, alamat saya adalah Uni Soviet?

microBIGDATA atau FIAS di saku Anda


Peter Brueghel the Younger, Tax Payment , 1640

Entri terakhir pada pencukur pada benda-benda pergi. Kami akan melanjutkan pengintaian dalam pertempuran. Hari ini kita akan berbicara tentang yang sulit. Ini bukan tentang DATA BESAR, tetapi sudah tidak nyaman untuk bekerja - data dalam jumlah yang cukup besar. Tidak semua orang akan masuk ke dalam seluruh RAM, tetapi beberapa bahkan tidak akan muat pada disk (tidak ada cukup ruang, tetapi banyak sampah). Nama basis data kepercayaan kami FIAS adalah basis data sistem informasi alamat federal. Arsip 5,5 GB. Dan itu dikompresi menjadi arsip XML. Setelah membongkar, akan ada 53 GB penuh (menyimpan 110 GB untuk membongkar). Dan ketika Anda mulai menguraikannya dan mengubahnya, maka 110 GB tidak akan cukup. Tentang jumlah RAM yang diperlukan juga akan.

Semuanya akan baik-baik saja, tetapi Anda dapat menggali lebih jauh. Ada proyek pengumpulan data dan sistematisasi sumber terbuka internasional - OpenAddresses . Jadi akan ada lebih banyak database. Cakupan planet saat ini memiliki banyak bintik-bintik putih, misalnya, Rusia hampir tidak ada. Ukuran arsip adalah 10 GB.

Atau database proyek OpenStreetMaps yang cukup terkenal. Itu dibangun oleh sukarelawan berdasarkan Wikipedia. Cukup detail dan multibahasa. Sekarang arsip lengkap XML terkompresi dengan ukuran 74 GB.
Jika mereka mulai berbicara tentang alamat, berita tak terduga tiba pada waktunya dari DuckDuckGo , mesin pencari aman terbaik untuk hari ini, tentang peralihannya ke kartu Apple. Lebih tepatnya di Apple MapKit JS. Fitur yang paling menarik dalam konteks kami adalah "pencarian alamat yang ditingkatkan". Apakah Apple yang terbaik mengumpulkan dan melindungi data kami dengan susah payah? Ini akan diperlukan untuk melacak ...
Jadi tantangannya. Cara memasukkan semua kekayaan alamat ini ke dalam repositori yang menyenangkan untuk digunakan, agar Anda dapat bermimpi tentang API gratis (tentu saja dengan Python) dan tidak membiarkan besi tersumbat tersumbat pada beban yang belum dibaca. Sebut saja MicroBigData - mcBD atau ΞΌBG dalam bahasa Inggris :-)

Dalam ekonomi pengembang setiap detik (atau bahkan yang pertama), hal ini adalah direktori alamat, itu juga merupakan direktori toponim, hal yang sangat diperlukan. Dan ketika itu juga normatif, dipersiapkan, dibersihkan dan didokumentasikan dengan baik oleh tubuh yang tepat, itu hanya dongeng. Kita harus membayar upeti, layanan pajak Rusia melakukan produksi digitalnya dengan baik. Sejauh mungkin. Mungkin ada beberapa kelemahan di dalam dan pembersihan data berlanjut. Bagaimana mengatasi masalah ini, biarkan kepala negara berpikir. Mereka memutuskan untuk diri kita sendiri dan untuk kepentingan kita semua. Ngomong-ngomong, satu kesalahan ketik dari FIAS ditemukan pada contoh di bawah ini. Hasilnya tidak terpengaruh. Saya tidak memperbaikinya. Anda akan menemukan

Saya tidak tahu seberapa spesifik data alamat itu relevan dalam proyek Anda - ini semua adalah wilayah, kota, jalan. Tetapi tampaknya tidak ada satu proyek pun yang dapat dilakukan tanpa mereka. Itu adalah alamat tempat mencari seseorang atau tempat mengirim paket kepadanya. Rincian paspor atau dokumen lain apa pun harus disimpan. Atau mungkin alamat kantor atau objek wisata yang direkomendasikan untuk dikunjungi. Dan apa yang harus dilakukan? Dari mana mendapatkan

Solusi paling sederhana, tanpa memperhatikan kesalahan dan duplikat, adalah objek primitif yang mengandung string string literal (mereka adalah konstanta string, mereka juga string). Biarkan pengguna memasukkan entri yang diterima berikutnya ke dalamnya. Dan benda-benda dapat menyelamatkan diri - kita telah melewati ini .

Objek seperti itu, misalnya, seperti dijelaskan dalam kelas di bawah ini. Langsung dari buku teks , meskipun Amerika, tetapi disesuaikan dengan realitas Rusia kami - alih-alih ZIP mereka, akan ada kode pos kami. Saya juga akan mengganti kode pos dengan angka, tetapi demi monoton saya meninggalkan string. Siapa pun yang segera mengenali suatu bahasa, dan ini adalah ObjectScript, berhak mendapat suka.

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

Tentu saja, banyak yang akan marah, mereka mengatakan semuanya mencuat dari kantong benda (literal). Di mana itu telah dilihat, sehingga objek bersinar bidangnya secara publik?! Mari kita biarkan seperti ini, itu menyakitkan contoh yang fasih dan dapat dimengerti oleh siswa mana pun.

Ini sebenarnya yang dibutuhkan. Diisi bidang. Taruh di penyimpanan. Ditransfer ke objek lain untuk bekerja. Diwarisi lebih jauh kepada seseorang. Semuanya berfungsi. Dan disimpan!
Tetapi beberapa kata mengapa ini tidak layak dilakukan, harus dikatakan. Apa Alamat objek kami? Mengapa tidak bisa hanya sekelompok string teks? Keberatan paling jelas yang muncul dalam pikiran datang dari konteks - siapa yang menggunakan Alamat ini, dalam bentuk apa dan untuk tujuan apa? Cobalah untuk mengesampingkan pemikiran pemrograman Anda dan bayangkan bagaimana seorang "turis asing", "sejarawan", "inspektur pajak", "pengacara" dan sebagainya.

Saya percaya bahwa segera sejumlah pertanyaan dan klarifikasi tambahan muncul: bahasa apa yang digunakan, di mana pengkodean untuk menyimpan dan memberikan, ke era mana untuk mengklasifikasikan, dokumen apa yang diberlakukan, legal atau pos? Apakah sebuah kota bernama pemukiman atau apa? Bahkan jalan bisa berubah menjadi bulevar, jalan samping, jalan atau yang lainnya. Apa yang harus dilakukan dengan semua detail implementasi penting ini?

Ambil contoh hidup. Google sekarang dijalankan oleh Sundar Pichai. Dia sendiri berasal dari India. Lahir di kota Chennai (alias Chennai). Atau di Madras? Pada tahun 1996, orang-orang India memutuskan bahwa nama kota itu sangat Portugis dan berganti nama menjadi ibu kota Tamil Nadu dari Madras ke Chennai. Dan apa yang harus ditulis Sundar dan 72 juta rekan senegaranya dalam dokumen elektroniknya?

Secara umum, seluruh ilmu pengetahuan berurusan dengan ini - menerapkan toponimi .
Jadi pertanyaan memohon. Bagaimana cara menangani waktu dan tanggal ? Apakah uang begitu jelas ? Apakah koordinat geografis begitu sederhana? Dan bagaimana ini diterapkan dalam kode Anda? Bisakah Anda mentransfer ke DBMS yang dipilih tanpa menurunkan tingkat abstraksi? Bagaimana tidak menyelinap ke dalam jenis data mesin atom dan terus-menerus memikirkan rekonstruksi mereka? Di sini ada baiknya mencari sumber API yang primitif atau, sebaliknya, suara. Pikirkan tentang hal itu di waktu luang Anda.

Singkatnya, konteks adalah yang paling penting. Dan model objek memungkinkan kita untuk menggunakannya secara langsung melalui enkapsulasi "data mesin" dan penerapan perilaku "langsung" yang peka konteks. Sama sekali tidak tuple tingkat rendah yang ditata dalam tabel ;-)

Sementara itu, mari kita kembali ke implementasi "primitif" dan mempersulit hidup kita. Untuk memulai, hilangkan kesalahan dan duplikat. Artinya, kami akan mencari cara untuk menulis alamat segera. Pada saat yang sama, kami akan membantu pengembang antarmuka pengguna untuk mengatur kiat bagi pengguna saat mengisi bidang entri data.
Ketika dua orang berkumpul di satu tempat - teks dan platform data IRIS InterSystems, pengembang memiliki peluang nyata untuk menggunakan sepenuhnya tanpa meninggalkan mesin. Misalnya, menggunakan komponen objek bawaan iKnow dan iFind . Ini adalah komponen untuk bekerja dengan data tidak terstruktur dan pencarian teks lengkap , masing-masing. Rusia didukung "di luar kotak".
Hal pertama yang pertama, kami akan mengajarkan Alamat untuk membaca data yang diperlukan dari sumber aslinya. Untungnya, kumpulan data dari layanan pajak federal memiliki deskripsi siap pakai tentang struktur dokumen XML. Menurut uraian yang terlampir pada data dari situs web FIAS , kita memerlukan kumpulan data ADDROBJ, yang, dalam kasus saya, sesuai dengan file AS_ADDROBJ_2_250_01_04_01_01.xsd

Selanjutnya, kita akan menggunakan sistem converter XSD template ke struktur bidang yang sesuai dari kelas% XML.Adaptor, silakan disiapkan untuk kita oleh pengembang IRIS. Tanda persen di awal hanya berarti bahwa ini adalah kelas dari pustaka sistem. Rincian penggunaan ada dalam dokumentasi . Kami akan melakukan operasi di terminal.

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

Hal yang sama dapat diperoleh di Atelier IDE (di Tools> Add-Ins> XML Schema Wizard menu) atau dengan permintaan serupa ke objek langsung dari kode program.



Karena kami menggunakan konstruktor tanpa menentukan parameter, yaitu nama paket untuk menempatkan kelas yang dihasilkan, mereka berakhir di paket Tes. Seperti yang Anda lihat dari perintah kedua, saya memberikan file skema melalui server web lokal saya di Python:

 python3 -m http.server 80 

Anda dapat menggunakan http-server lain yang Anda suka. Atau unggah file ke server IRIS Anda dan tunjukkan jalur langsung ke sana.

Sebagai hasilnya, kami memiliki dua kelas yang sepenuhnya mencerminkan struktur XML beralamat kami:

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 ]; } 

Test.object
 ///  : 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 ]; } 


Dari seluruh daftar file xml di FIAS kami hanya akan menggunakan file dengan nama wilayah, kota, dan jalan. Pada saat mempersiapkan publikasi, saya memiliki ini:
AS_ADDROBJ_20190106_90809714-fe22-45b2-929c-52bd950963e0.XML

Ukuran file tidak besar atau kecil, tetapi hampir 3 GB. Anda tidak akan membukanya dengan alat teks biasa - mereka tidak mencerna ukuran ini.
By the way, panjang maksimum string literal (tipe String) di InterSystems IRIS tidak lebih dari 3.641.144 karakter. Artinya, mengunduh file secara langsung atau URL ke dalamnya akan gagal. Pembatasan lain dapat ditemukan dalam dokumentasi . Untuk bekerja dengan volume data yang besar, Anda dapat menggunakan aliran data (stream) yang tidak memiliki batas panjang.
Mari kita lihat apa yang kita dapat?

Memasak boneka lada FIAS. Ini hanya persiapan untuk masa depan yang indah. Pertama kita mendapatkan set minimum awal. Kami hanya membutuhkan bahan-bahan ini:

 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 ]; 

Selanjutnya, lakukan penulisan . Kami membuat objek yang memahami XML sebagai asli - kami menggunakan kelas dari pustaka sistem% XML.Reader:

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

Dan kami memberinya instruksi, siapa yang harus mengambil, dan mengabaikan sisanya. Kami akan menerima satu porsi:

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

Lalu ada variasi tentang cara mendapatkan file microbd asli. Jika nyaman, Anda bisa meletakkannya di sebelah repositori - secara lokal di sistem file server IRIS. Atau, seperti dalam contoh saya, minta kirim via HTTP. Ada opsi yang bahkan lebih universal, yang akan ada beberapa kata di bawah ini.

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

Penting! Pada saat ini, mayoritas yang akan memberikan contoh ini pada diri mereka sendiri akan memiliki hal yang mengerikan. Sistem akan kembali sebagai ganti β€œ1” (semuanya beres), sesuatu yang dimulai dengan β€œ0 ΒΈ STORE ...”. Dan itu tidak akan menyenangkan. Artinya, file dengan microbase tampaknya tidak cukup mikro dan tidak cocok dengan objek kita. Memori yang dialokasikan untuknya tidak cukup. Dipecahkan? Tentu saja Platform data IRIS memungkinkan Anda membuat objek hingga 4 TB dalam RAM. Lalu apa yang salah? Secara default, pengaturan sistem diatur ke 256 MB per objek. Dan kita akan membutuhkan lebih banyak lagi. Dan ingat, ini adalah persyaratan RAM. Apakah ada cukup stok di komputer / server Anda?
Berapa ukuran memori yang kita perlukan untuk menginstal raksasa ini yang telah kita instal secara empiris - hampir 10 GB. Apa yang perlu Anda tentukan dalam pengaturan (Menu> Konfigurasi memori> Memori maksimum per proses (KB)) atau melalui variabel sistem $ ZSTORAGE (dalam kilobyte):

 set $ZSTORAGE=10000000 

Meluncurkan proses baru dengan pengaturan memori yang diperlukan? Kemudian semuanya menjadi lebih sederhana - kita membaca dan menyimpan.

Ada opsi alternatif (dan mungkin lebih disukai) - gunakan properti UsePPGHandler dari kelas% XML.Reader yang memungkinkan Anda untuk tidak menyimpan XML dalam memori dan bekerja dengan pengaturan memori standar.

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

lebih lanjut ... Korelasi / Baca, dll. ...

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

Jadi 3.722.548 kali untuk setiap operasi :-)

Ini melelahkan. Oleh karena itu, kami menambah kelas FIAS.AddressObject kami dengan metode untuk impor, berdasarkan perintah yang baru saja ditampilkan:

 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)} } 

Mari kita gunakan kekuatan exocortex komputer kita - hanya satu perintah di terminal :

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



Saya meminta semua orang ke meja. Ada MCD, dan sekarang hidangan jadi dalam bentuk global dengan nama kota-kota Rusia yang terverifikasi dan bobot siap.



Dan akhirnya beberapa kata tentang kapan 4TB tidak cukup. Dalam hal ini, kami mengikuti aliran (atau aliran jika Anda mau). Dokumentasi diletakkan di rak. Anda bisa biner, Anda bisa simbolis. Toko di global juga tidak dilarang. Resepnya adalah ini: kita mengambil aliran air, memotongnya menjadi beberapa bagian dan memberikannya kepada benda-benda yang kita butuhkan untuk konsumsi.

Lebih lanjut, tentang objek ObjectScript yang indah dan API dialamatkan dengan Python tidak cocok. Akan ada cerita tersendiri.
Menyenangkan: Gartner baru saja menyelesaikan koleksi tahunan penilaian dan ulasan pengguna nyata dalam kategori DBMS dan atas dasar ini telah menerbitkan peringkatnya tentang DBMS terbaik 2019. InterSystems CachΓ© dan InterSystems IRIS Data Platform produk telah menerima peringkat pilihan konsumen tertinggi. Dari siapa yang Anda pilih dan cara Anda memberi peringkat, Anda dapat melihatnya sendiri .
Perangkat Lunak Sistem Manajemen Basis Data Operasional Terbaik 2019 yang diulas oleh Pelanggan

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


All Articles