{"id":36632,"date":"2019-10-31T22:12:47","date_gmt":"2019-10-31T19:12:47","guid":{"rendered":"https:\/\/prohoster.info\/blog\/globaly-mechi-kladentsy-dlya-hraneniya-dannyh-razrezhennye-massivy-chast-3\/"},"modified":"2019-10-31T22:12:47","modified_gmt":"2019-10-31T19:12:47","slug":"globaly-mechi-kladentsy-dlya-hraneniya-dannyh-razrezhennye-massivy-chast-3","status":"publish","type":"post","link":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/globaly-mechi-kladentsy-dlya-hraneniya-dannyh-razrezhennye-massivy-chast-3","title":{"rendered":"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3\" src=\"\/wp-content\/uploads\/2019\/07\/ac6eefbfb9d7cc28c3f2ca85c7d1adb2.jpg\" style=\"display:block;margin: 0 auto;\" \/>Nas partes anteriores (<noindex><a rel=\"nofollow\" href=\"http:\/\/habrahabr.ru\/company\/intersystems\/blog\/263791\/\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/habrahabr.ru\/company\/intersystems\/blog\/264173\/\">2<\/a><\/noindex>) n\u00f3s falamos sobre globais como \u00e1rvores, nesta vamos considerar globais como arrays esparsos.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B0%D0%B7%D1%80%D0%B5%D0%B6%D1%91%D0%BD%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2\">Array esparso<\/a><\/noindex> \u00e9 um tipo de array onde a maioria dos valores assume o mesmo valor.<\/p>\n<p>Na pr\u00e1tica, muitas vezes encontramos arrays esparsos t\u00e3o enormes que n\u00e3o faz sentido ocupar mem\u00f3ria com elementos iguais. Portanto, \u00e9 razo\u00e1vel implementar arrays esparsos de forma que a mem\u00f3ria n\u00e3o seja consumida para armazenar valores iguais.<br \/>\nEm algumas linguagens de programa\u00e7\u00e3o, arrays esparsos fazem parte da pr\u00f3pria linguagem, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.jsoftware.com\/help\/dictionary\/d211.htm\">por exemplo, em J<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.mathworks.com\/help\/matlab\/ref\/sparse.html\">MATLAB<\/a><\/noindex>. Em outras linguagens de programa\u00e7\u00e3o, existem bibliotecas especiais que permitem implement\u00e1-los. Para C++ \u2014 <noindex><a rel=\"nofollow\" href=\"http:\/\/eigen.tuxfamily.org\/dox-devel\/GettingStarted.html\">Eigen<\/a><\/noindex> e outras. <\/p>\n<p>Globais s\u00e3o bons candidatos para a implementa\u00e7\u00e3o de arrays esparsos, porque:<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<ol>\n<li>Armazenam valores apenas de certos n\u00f3s e n\u00e3o armazenam valores indefinidos;<\/li>\n<li>A interface de acesso ao valor de um n\u00f3 \u00e9 extremamente semelhante a como o acesso a elementos de um array multidimensional \u00e9 implementado em muitas linguagens de programa\u00e7\u00e3o.\n<pre><code class=\"bash\">Set ^a(1, 2, 3)=5\nWrite ^a(1, 2, 3)<\/code><\/pre>\n<p>\n<\/li>\n<li>Global \u00e9 uma estrutura de n\u00edvel relativamente baixo para armazenamento de dados, portanto, possui caracter\u00edsticas de velocidade excepcionais (de centenas de milhares a dezenas de milh\u00f5es de transa\u00e7\u00f5es por segundo, dependendo do hardware, veja) <noindex><a rel=\"nofollow\" href=\"http:\/\/habrahabr.ru\/company\/intersystems\/blog\/257501\/\">1<\/a><\/noindex>)<\/li>\n<\/ol>\n<p><\/p>\n<blockquote><p>Como global \u00e9 uma estrutura persistente, ent\u00e3o faz sentido implementar arrays esparsos sobre eles quando j\u00e1 sabemos que o volume de mem\u00f3ria RAM ser\u00e1 insuficiente.<\/p><\/blockquote>\n<p>\nUma das propriedades das implementa\u00e7\u00f5es de arrays esparsos \u00e9 devolver um certo valor padr\u00e3o se a refer\u00eancia for feita a uma c\u00e9lula indefinida.<\/p>\n<p>Isso pode ser realizado utilizando a fun\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.intersystems.com\/cache20152\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_fget\">$GET<\/a><\/noindex> no COS. Neste exemplo, um array tridimensional \u00e9 considerado.<\/p>\n<pre><code>SET a = $GET(^a(x,y,z), defValue)<\/code><\/pre>\n<p>\nEm quais problemas s\u00e3o necess\u00e1rios arrays esparsos e como os globais podem ajudar?<\/p>\n<h2>Matriz de adjac\u00eancia (conex\u00e3o)<\/h2>\n<p>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%9C%D0%B0%D1%82%D1%80%D0%B8%D1%86%D0%B0_%D1%81%D0%BC%D0%B5%D0%B6%D0%BD%D0%BE%D1%81%D1%82%D0%B8\">Essas matrizes<\/a><\/noindex> s\u00e3o utilizadas para representar gr\u00e1ficos:<\/p>\n<p><img decoding=\"async\" alt=\"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3\" src=\"\/wp-content\/uploads\/2019\/07\/a580c451610bcacbef154c161ef63939.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00c9 evidente que quanto maior o gr\u00e1fico, mais zeros haver\u00e1 na matriz. Se, por exemplo, pegarmos o gr\u00e1fico de uma rede social e o representarmos como uma matriz, ela quase toda ser\u00e1 composta de zeros, ou seja, ser\u00e1 um array esparso.<\/p>\n<pre><code class=\"bash\">Set ^m(id1, id2) = 1 \nSet ^m(id1, id3) = 1 \nSet ^m(id1, id4) = 1 \nSet ^m(id1) = 3 \nSet ^m(id2, id4) = 1 \nSet ^m(id2, id5) = 1 \nSet ^m(id2) = 2\n....\n<\/code><\/pre>\n<p>\nNeste exemplo, estamos salvando no global <strong>^m<\/strong> a matriz de conectividade, bem como o n\u00famero de arestas em cada n\u00f3 (quem \u00e9 amigo de quem e o n\u00famero de amigos).<\/p>\n<p>Se o n\u00famero de elementos no gr\u00e1fico n\u00e3o exceder 29 milh\u00f5es (este n\u00famero \u00e9 obtido como o produto de 8 * <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.intersystems.com\/cache201512\/csp\/docbook\/DocBook.UI.Page.cls?KEY=GORIENT_appx_limits_long_string\">o tamanho m\u00e1ximo da string<\/a><\/noindex>), existe um m\u00e9todo ainda mais econ\u00f4mico para armazenar tais matrizes \u2014 bitstrings, pois na sua implementa\u00e7\u00e3o grandes lacunas s\u00e3o otimizadas de maneira especial.<\/p>\n<p>As opera\u00e7\u00f5es com bitstrings s\u00e3o realizadas pela fun\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.intersystems.com\/cache20152\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_fbit\">$BIT<\/a><\/noindex>. <\/p>\n<pre><code class=\"bash\">; definir um bit\nSET $BIT(rowID, positionID) = 1\n; obter um bit\nWrite $BIT(rowID, positionID)\n<\/code><\/pre>\n<p><\/p>\n<h2>Tabela de transi\u00e7\u00f5es de um aut\u00f4mato finito<\/h2>\n<p>\nComo o gr\u00e1fico de transi\u00e7\u00f5es de um aut\u00f4mato finito \u00e9 um gr\u00e1fico comum, a tabela de transi\u00e7\u00f5es de um aut\u00f4mato finito \u00e9 a mesma matriz de adjac\u00eancia mencionada acima.<\/p>\n<h2>Aut\u00f4matos celulares<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3\" src=\"\/wp-content\/uploads\/2019\/07\/b9fedb51cd1c8fced79ca221a925349c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nO aut\u00f4mato celular mais famoso \u00e9 <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%96%D0%B8%D0%B7%D0%BD%D1%8C_(%D0%B8%D0%B3%D1%80%D0%B0)\">o jogo 'Vida'<\/a><\/noindex>, que devido \u00e0s suas regras (quando uma c\u00e9lula tem muitos vizinhos \u2014 ela morre) representa uma matriz esparsa.<\/p>\n<p>Stephen Wolfram acredita que os aut\u00f4matos celulares s\u00e3o uma <noindex><a rel=\"nofollow\" href=\"https:\/\/ru.wikipedia.org\/wiki\/A_New_Kind_of_Science\">nova \u00e1rea da ci\u00eancia<\/a><\/noindex>. Em 2002, ele publica um livro de 1280 p\u00e1ginas intitulado 'A Nova Ci\u00eancia', onde argumenta amplamente que as descobertas na \u00e1rea dos aut\u00f4matos celulares n\u00e3o s\u00e3o isoladas, mas bastante robustas e t\u00eam grande significado para todas as \u00e1reas da ci\u00eancia.<\/p>\n<p>Foi provado que qualquer algoritmo execut\u00e1vel em um computador pode ser implementado usando aut\u00f4matos celulares. Aut\u00f4matos celulares s\u00e3o usados para modelar ambientes din\u00e2micos e sistemas, para resolver problemas algor\u00edtmicos e outros prop\u00f3sitos.<\/p>\n<p>Se temos um grande campo e precisamos registrar todos os estados intermedi\u00e1rios do aut\u00f4mato celular, \u00e9 razo\u00e1vel usar globais.<\/p>\n<h2>Cartografia<\/h2>\n<p>\nA primeira coisa que me vem \u00e0 mente quando se fala sobre o uso de matrizes esparsas s\u00e3o os problemas cartogr\u00e1ficos.<\/p>\n<p>Normalmente, nos mapas h\u00e1 muito espa\u00e7o vazio. Se o mapa for representado como grandes pixels, 71% dos pixels da Terra seriam ocupados pelo oceano. Matriz esparsa. E se considerarmos apenas as obras das m\u00e3os humanas, o espa\u00e7o vazio seria mais de 95%.<\/p>\n<p>Claro, ningu\u00e9m armazena mapas como matrizes raster; utiliza-se a representa\u00e7\u00e3o vetorial.<br \/>\nMas o que s\u00e3o realmente os mapas vetoriais? \u00c9 uma esp\u00e9cie de estrutura composta de pontos, polilinhas e pol\u00edgonos.<br \/>\nNa verdade, \u00e9 uma base de dados de pontos e suas conex\u00f5es.<\/p>\n<p>Uma das tarefas mais ambiciosas da cartografia \u00e9 a miss\u00e3o de mapear nossa gal\u00e1xia com o telesc\u00f3pio Gaia. Figurativamente, nossa gal\u00e1xia, assim como todo o universo, \u00e9 um vasto espa\u00e7o esparsamente povoado: enormes \u00e1reas de vazio, nas quais existem poucos pontos pequenos \u2014 estrelas. O vazio representa 99,999999...%. Para armazenar o mapa da nossa gal\u00e1xia, foi escolhido um banco de dados em globais \u2014 Cach\u00e9.<\/p>\n<p>N\u00e3o conhe\u00e7o a estrutura exata dos globais neste projeto, posso supor que seja algo parecido com:<\/p>\n<pre><code class=\"bash\">Set ^galaxy(b, l, d) = 1; N\u00famero da estrela no cat\u00e1logo, se existir\nSet ^galaxy(b, l, d, \"name\") = \"Sol\"\nSet ^galaxy(b, l, d, \"type\") = \"normal\"; op\u00e7\u00f5es blackhole, quasar, red_dwarf etc.\nSet ^galaxy(b, l, d, \"weight\") = 14E50\nSet ^galaxy(b, l, d, \"planetes\") = 7\nSet ^galaxy(b, l, d, \"planetes\", 1) = \"Merc\u00fario\"\nSet ^galaxy(b, l, d, \"planetes\", 1, weight) = 1E20\n...\n<\/code><\/pre>\n<p>\n<i>Onde b, l, d s\u00e3o <noindex><a rel=\"nofollow\" href=\"https:\/\/pt.wiki2.org\/wiki\/Sistema_de_coordenas_galctico\">coordenadas gal\u00e1cticas de latitude, longitude<\/a><\/noindex> e dist\u00e2ncia at\u00e9 o Sol.<\/i><\/p>\n<p>A estrutura flex\u00edvel dos globais permite armazenar quaisquer caracter\u00edsticas necess\u00e1rias de estrelas e planetas, j\u00e1 que as bases em globais n\u00e3o t\u00eam esquema (scheme-less).<\/p>\n<p>A escolha do Cach\u00e9 para armazenar o mapa de nosso universo n\u00e3o se deve apenas \u00e0 flexibilidade, mas tamb\u00e9m \u00e0 capacidade de rapidamente salvar fluxos de dados, ao mesmo tempo em que cria globais indexados para uma busca r\u00e1pida.<\/p>\n<p>Se voltarmos \u00e0 Terra, alguns projetos de mapeamento foram criados em globais <noindex><a rel=\"nofollow\" href=\"http:\/\/wiki.openstreetmap.org\/wiki\/Xapi\">OpenStreetMap XAPI<\/a><\/noindex> e o fork do OpenStreetMap \u2014 <noindex><a rel=\"nofollow\" href=\"http:\/\/www.fosm.org\/\">FOSM<\/a><\/noindex>.<\/p>\n<p>Recentemente, no <noindex><a rel=\"nofollow\" href=\"http:\/\/habrahabr.ru\/company\/intersystems\/blog\/267459\/\">hackathon Cach\u00e9<\/a><\/noindex> foram implementados \u00edndices geoespaciais <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/intersystems-ru\/spatialindex\">Geospatial<\/a><\/noindex>. Ansiosos pelos detalhes da implementa\u00e7\u00e3o por parte dos autores do artigo.<\/p>\n<h3>A implementa\u00e7\u00e3o de \u00edndices espaciais em globais no OpenStreetMap XAPI<\/h3>\n<p>\nAs imagens foram retiradas de <noindex><a rel=\"nofollow\" href=\"http:\/\/www.slideshare.net\/george.james\/fosdem-2010-gtm-and-openstreetmap\">desta apresenta\u00e7\u00e3o<\/a><\/noindex>.<\/p>\n<p>Todo o globo terrestre \u00e9 dividido em quadrados, depois em subquadrados, e os subquadrados em quadradinhos, e assim por diante. No geral, obtemos uma estrutura hier\u00e1rquica para o armazenamento, para a qual foram criados globais.<\/p>\n<p><img decoding=\"async\" alt=\"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3\" src=\"\/wp-content\/uploads\/2019\/07\/239c54c201b8013f1897ecf1ccadcc9c.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nA qualquer momento, podemos praticamente solicitar instantaneamente o quadrado necess\u00e1rio ou limp\u00e1-lo, e todos os subquadrados tamb\u00e9m ser\u00e3o retornados ou limpos.<\/p>\n<p>Um esquema semelhante em globais pode ser implementado de v\u00e1rias maneiras.<\/p>\n<p>Op\u00e7\u00e3o 1:<\/p>\n<pre><code class=\"bash\">Set ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 1) = idPrimeiroPonto\nSet ^m(a, b, a, c, d, a, b,c, d, a, b, a, c, d, a, b,c, d, a, 2) = idSegundoPonto\n...<\/code><\/pre>\n<p>\nOp\u00e7\u00e3o 2:<\/p>\n<pre><code class=\"bash\">Set ^m('abacdabcdabacdabcda', 1) = idPrimeiroPonto\nSet ^m('abacdabcdabacdabcda', 2) = idSegundoPonto\n...<\/code><\/pre>\n<p>\nEm ambos os casos, n\u00e3o \u00e9 dif\u00edcil solicitar pontos localizados em um quadrado de qualquer n\u00edvel no COS\/M. Ser\u00e1 um pouco mais f\u00e1cil limpar peda\u00e7os quadrados de espa\u00e7o de qualquer n\u00edvel na primeira op\u00e7\u00e3o, mas isso raramente \u00e9 necess\u00e1rio.<\/p>\n<p>Exemplo de um dos quadrados do n\u00edvel inferior:<\/p>\n<p><img decoding=\"async\" alt=\"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3\" src=\"\/wp-content\/uploads\/2019\/07\/1fba7eb9253c6af9206cb168c6d43f2a.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAqui est\u00e3o alguns globais do projeto XAPI: representa\u00e7\u00e3o do \u00edndice em globais:<\/p>\n<p><img decoding=\"async\" alt=\"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3\" src=\"\/wp-content\/uploads\/2019\/07\/3a80dd4c3fb23d0f2d3094703966f74b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nGlobal <strong>^way<\/strong> usado para armazenar pontos <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Polygonal_chain\">polilinhas<\/a><\/noindex> (estradas, rios pequenos, etc.) e pol\u00edgonos (\u00e1reas fechadas: edif\u00edcios, florestas, etc.).<\/p>\n<h2>Classifica\u00e7\u00e3o bruta do uso de matrizes esparsas em globais.<\/h2>\n<p><\/p>\n<ol>\n<li>Armazenamos as coordenadas de certos objetos e seus estados (mapeamento, aut\u00f4matos celulares)<\/li>\n<li>Armazenamos matrizes esparsas.<\/li>\n<\/ol>\n<p>\nNo caso 2) ao solicitar uma coordenada espec\u00edfica, onde o elemento n\u00e3o tem valor atribu\u00eddo, devemos obter o valor do elemento da matriz esparsa por padr\u00e3o.<\/p>\n<h2>Os b\u00f4nus que recebemos ao armazenar matrizes multidimensionais em globais<\/h2>\n<p>\n<b>Remo\u00e7\u00e3o r\u00e1pida e\/ou amostragens de peda\u00e7os de espa\u00e7o que s\u00e3o m\u00faltiplos de linhas, planos, cubos, etc.<\/b> Para casos em que \u00edndices inteiros s\u00e3o utilizados, pode ser \u00fatil a capacidade de remo\u00e7\u00e3o r\u00e1pida e\/ou amostragens de peda\u00e7os de espa\u00e7o que s\u00e3o m\u00faltiplos de linhas, planos, cubos, etc.<\/p>\n<p>Comando <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.intersystems.com\/cache20152\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_ckill\">Kill<\/a><\/noindex> podemos remover tanto um elemento individual, quanto uma linha, e at\u00e9 mesmo um plano inteiro. Gra\u00e7as \u00e0s propriedades dos globais, isso acontece muito rapidamente \u2014 milhares de vezes mais r\u00e1pido do que a remo\u00e7\u00e3o elemento por elemento.<\/p>\n<p>A figura mostra uma matriz tridimensional em um global <strong>^a<\/strong> e diferentes tipos de remo\u00e7\u00f5es.<\/p>\n<p><img decoding=\"async\" alt=\"Globais \u2014 espadas m\u00e1gicas para o armazenamento de dados. Matrizes esparsas. Parte 3\" src=\"\/wp-content\/uploads\/2019\/07\/cc85ee59d42595df0d72480d3e533a12.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nPara amostrar peda\u00e7os de espa\u00e7o por \u00edndices conhecidos, pode-se usar o comando <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.intersystems.com\/cache20152\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_cmerge\">Merge<\/a><\/noindex>.<\/p>\n<p>Amostragem de uma coluna da matriz na vari\u00e1vel Column:<\/p>\n<pre><code class=\"bash\">; Vamos definir uma matriz esparsa tridimensional 3x3x3\nSet ^a(0,0,0)=1,^a(2,2,0)=1,^a(2,0,1)=1,^a(0,2,1)=1,^a(2,2,2)=1,^a(2,1,2)=1\nMerge Column = ^a(2,2)\n; Vamos exibir a vari\u00e1vel Column\nZwrite Column\n<\/code><\/pre>\n<p>\nConclus\u00e3o:<\/p>\n<pre><code class=\"bash\">Column(0)=1\nColumn(2)=1\n<\/code><\/pre>\n<p>\nO que \u00e9 interessante \u00e9 que a vari\u00e1vel Column tamb\u00e9m resultou em uma matriz esparsa, a qual deve ser acessada tamb\u00e9m atrav\u00e9s de <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.intersystems.com\/cache20152\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_fget\">$GET<\/a><\/noindex>, uma vez que os valores padr\u00e3o n\u00e3o s\u00e3o armazenados nela.<\/p>\n<p>A amostragem de peda\u00e7os de espa\u00e7o tamb\u00e9m pode ser feita atrav\u00e9s de um pequeno programa utilizando a fun\u00e7\u00e3o <noindex><a rel=\"nofollow\" href=\"http:\/\/docs.intersystems.com\/cache20152\/csp\/docbook\/DocBook.UI.Page.cls?KEY=RCOS_forder\">$Order<\/a><\/noindex>. Isso \u00e9 especialmente conveniente em espa\u00e7os cujos \u00edndices n\u00e3o s\u00e3o quantizados (cartografia).<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>\nOs tempos atuais imp\u00f5em novas e ambiciosas tarefas. Os grafos podem conter bilh\u00f5es de v\u00e9rtices, os mapas bilh\u00f5es de pontos, e algu\u00e9m pode at\u00e9 querer lan\u00e7ar seu pr\u00f3prio universo em aut\u00f4matos celulares (<noindex><a rel=\"nofollow\" href=\"http:\/\/lenta.ru\/news\/2009\/08\/28\/universe\/\">1<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.worldscientific.com\/worldscibooks\/10.1142\/4702\">2<\/a><\/noindex>).<\/p>\n<p>Quando o volume de dados de matrizes esparsas n\u00e3o pode mais ser armazenado na mem\u00f3ria RAM e \u00e9 necess\u00e1rio trabalhar com eles, deve-se considerar a implementa\u00e7\u00e3o de tais projetos em globais e COS.<\/p>\n<p>Obrigado pela aten\u00e7\u00e3o! Aguardamos suas perguntas e sugest\u00f5es nos coment\u00e1rios.<\/p>\n<p><b>Aviso Legal<\/b>: <i>este artigo e meus coment\u00e1rios a ele s\u00e3o minha opini\u00e3o e n\u00e3o t\u00eam rela\u00e7\u00e3o com a posi\u00e7\u00e3o oficial da corpora\u00e7\u00e3o InterSystems.<\/i><br \/>\n<br \/>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/intersystems\/blog\/268465\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0447\u0430\u0441\u0442\u044f\u0445 (1, 2) \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438 \u043e \u0433\u043b\u043e\u0431\u0430\u043b\u0430\u0445 \u043a\u0430\u043a \u043e \u0434\u0435\u0440\u0435\u0432\u044c\u044f\u0445, \u0432 \u044d\u0442\u043e\u0439 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0433\u043b\u043e\u0431\u0430\u043b\u044b \u043a\u0430\u043a \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u2014 \u044d\u0442\u043e \u0440\u0430\u0437\u043d\u043e\u0432\u0438\u0434\u043d\u043e\u0441\u0442\u044c \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0447\u0430\u0441\u0442\u043e \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u044e\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0433\u0440\u043e\u043c\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u0447\u0442\u043e \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0441\u043c\u044b\u0441\u043b\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0441\u043c\u044b\u0441\u043b \u0440\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u0442\u044c [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":27432,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-36632","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/globaly-mechi-kladentsy-dlya-hraneniya-dannyh-razrezhennye-massivy-chast-3\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"pt_PT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0413\u043b\u043e\u0431\u0430\u043b\u044b \u2014 \u043c\u0435\u0447\u0438-\u043a\u043b\u0430\u0434\u0435\u043d\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/globaly-mechi-kladentsy-dlya-hraneniya-dannyh-razrezhennye-massivy-chast-3\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T19:12:47+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T19:12:47+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Globais \u2014 espadas m\u00e1gicas para armazenamento de dados. Matrizes esparsas. Parte 3 | ProHoster","description":"","canonical_url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/globaly-mechi-kladentsy-dlya-hraneniya-dannyh-razrezhennye-massivy-chast-3","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"pt_PT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0413\u043b\u043e\u0431\u0430\u043b\u044b \u2014 \u043c\u0435\u0447\u0438-\u043a\u043b\u0430\u0434\u0435\u043d\u0446\u044b \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445. \u0420\u0430\u0437\u0440\u0435\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b. \u0427\u0430\u0441\u0442\u044c 3 | ProHoster","og:url":"https:\/\/prohoster.info\/pt\/blog\/administrirovanie\/globaly-mechi-kladentsy-dlya-hraneniya-dannyh-razrezhennye-massivy-chast-3","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T19:12:47+00:00","article:modified_time":"2019-10-31T19:12:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"36632","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-22 04:12:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 01:41:52","updated":"2026-01-22 04:12:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/36632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/comments?post=36632"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/posts\/36632\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media\/27432"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/media?parent=36632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/categories?post=36632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/pt\/wp-json\/wp\/v2\/tags?post=36632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}