язык программирования M, он же MUMPS, ДИАМС. параллельная обработка

Калитин Евгений -> Всем
язык программирования M, он же MUMPS, ДИАМС. параллельная обработка
! привет<br/> .свою сагу начну с упоминания моего учителя и профи языка программирования М и удивительного друга Александра Велиева который ведёт сайт www.cgi2m.net.ua откуда я и копирую со своими комментариями его статью<br/> <br/> :: Параллельная обработка :.<br/> <br/> Я счастлив, что М успешно справился с новым вызовом времени — параллельной обработкой.<br/> Это новейший и абсолютно иной вид программистского мышления.<br/> <br/> Как я боялся своей программы<br/> Начало этой истории — зима 2006 года.<br/> Знакомая попросила для брата-студента книгу о Прологе.<br/> Я разыскал Пролог-библию Братко и наконец решил её прочесть снова.<br/> В ней я прочёл, как элегантно Братко нашёл алгоритм наибольшего общего делителя без вычислений.<br/> Это решение было настолько элегантно, что я решил написать что-либо подобное в М.<br/> Я написал программу на бумаге и боялся её запустить.<br/> Как старый мумпсер я знал о строгих ограничениях на количество подпроцессов и не мог оценить размера базы данных, который для этого понадобится.<br/> Я не хотел начинать испытания такой элегантной и мощной программы с таких вещей, как крах базы данных или отказ компилятора.<br/> Но узнав GT.M лучше, я начал сомневаться в своих сомнениях и решил попросить совета на comp.lang.mumps.<br/> Сразу же г-н. K.S.Bhaskar ответил мне.<br/> Благодаря его советам и поддержке я смог её успешно испытать. Вот код:<br/> ;Эта программа создаёт численные ряды ;a - простые числа(делятся на 1 и себя) ;b - ряды делителей ;c - ряд простых чиселexample ; k ^a,^b,^c,^pid s Lim=1000000,^p=0,h1=$h f i=2:1:Lim s ^a(i)=i s (i,^c(1))=1 f s i=$o(^a(i)) q:i="" d .j a(i,Lim)::0 i d c .e d a(i,Lim) w Lim,i,! s h2=$h zwr qa(v1,v2) s ^pid($j)=,(^b(v1,v1),^c(v1))=v1,c=v1+v1 i c<v2 f n=c:v1:v2 k ^a(n) s (^b(v1,n),^c(n))=n k ^pid($j) qc k p m p=^pid s c="" f s=0:1 s c=$o(p©) q:c="" s c=$g(p) s:c<s ^pid=s w P ,i, ,s, ,c,! q<br/> Испытания этой программы в GT.M было успешным — об этом Вы можете прочесть на форуме comp.lang.mumps.<br/> <br/> Больше примеров<br/> <br/> На форуме sql.ru я попросил коллег протестировать эту программу в Intersystems Cache.<br/> Во время этого своеобразного виртуального мозгового штурма было предложено и опробовано много разных параллельных алгоритмов под разными углами зрения.<br/> Так, был опубликован и испытан параллельный алгоритм Аткина для нахождения ряда простых чисел, а также гибридный авторский алгоритм от программиста, зарегистрированного под псевдонимом MaWR, численные параметры и многое другое.<br/> Посетите этот форум — я уверен, что Вы найдёте там для себя много полезного.<br/> Практическое использование<br/> Вы можете спросить — а какая практическая польза от этого кроме «шахматных этюдов»?<br/> Для Интернета наиболее важным является возможность проведения крупномасштабной обработки с эффективным контролем над ней.<br/> Ожидание броузера определяется параметром KEEP_ALIVE (обычно это 300 секунд), и по истечении этого периода связь с сервером разрывается.<br/> Это может привести к утере ответа или даже к краху вашей базы данных.<br/> Аякс — плохой помощник в этом деле, потому что постоянными запросами XMLHttp.onreadystatechange просто завесит WEB-страницу.<br/> В М вы просто запустите нужное Вам количество подпроцессов, а затем отправите ответ броузуру клиента без ожидания результата.<br/> выполнения задачи Вы сможете проконтролировать позже серий запросов.<br/> Такой вид обработки просто недостижим на SQL-платформе в принципе, а традиционная обработка в SQL завалит сервер, разрушит базу данных или остановит сайт на неопределённое время.<br/> Также очень полезным применением такого метода является имитация интенсивного доступа к вашей базе данных<br/> Я запускал до тысячи процессов в очереди, получая правильный результат с приемлемым временем исполнения.<br/> А это очень важный момент для Интернет/Интранет-приложений.<br/> <br/> Ссылки<br/> обсуждение на форуме sql.ru<br/> M[UMPS] by Example<br/> статья в Википедии про MUMPS<br/> m в web<br/> <br/> Комментарии<br/> k ^a,^b,^c,^pid s Lim=1000000,^p=0,h1=$hудаляет записи с именами ^a,^b,^c,^pid из базы вместе с потомками^p=0,h1=$hзаписи в базе с именем p присвоить ноль, переменной локальной h1 присвоить текущее время f i=2:1:Lim s ^a(i)=iдля i от 2 с шагом 1 до Lim (то есть 1 миллион раз) установить записи в базе на диске a с индексом i значение переменной i s (i,^c(1))=1 f s i=$o(^a(i)) q:i="" dустановить i=1, переменной базы c с индексом 1 значение 1f это бесконечный циклs i=$o(^a(i)) q:i="" dустановить i значение следующего индекса после ^a(i) в базеq:i="" прервать цикл если i будет равно пустой строке, это случится когда мы дойдем до конца массива-базы ad значит что нужно вызывать подпрограмму начинающуюся с точки .j a(i,Lim)::0 i d cначало подпрограммы с точки - j a(i,Lim) - вызов параллельным процессом подпрограммы a с параметрами i,Lim ::0 это некие параметрыi d cесли установлен флаг ошибки после исполнения <b>J</b>ob, вызвать подпрограмму c .e d a(i,Lim) w Lim,i,!иначе - вызвать подпрограмму a с параметрами i,Lim но не отдельным процессом, напечатать Lim,i и перевести строкуоставшаяся часть кода - не сложнатам работа с базой как с массивом, но с 1 миллионов записей параллельно :)<br/> <br/> предыдущая статья цикла язык программирования M, он же MUMPS, ДИАМС. начало
×