<?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE article PUBLIC "-//NLM/DTD JATS (Z39.96) Journal Publishing DTD v1.2 20120330//EN" "http://jats.nlm.nih.gov/publishing/1.2/JATS-journalpublishing1.dtd">
    <!--<?xml-stylesheet type="text/xsl" href="article.xsl">-->
<article xmlns:ns0="http://www.w3.org/1999/xlink" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" article-type="research-article" dtd-version="1.2" xml:lang="en">
	<front>
		<journal-meta>
			<journal-id journal-id-type="issn">2303-9868</journal-id>
			<journal-id journal-id-type="eissn">2227-6017</journal-id>
			<journal-title-group>
				<journal-title>Международный научно-исследовательский журнал</journal-title>
			</journal-title-group>
			<issn pub-type="epub">2303-9868</issn>
			<publisher>
				<publisher-name>ООО Цифра</publisher-name>
			</publisher>
		</journal-meta>
		<article-meta>
			<article-id pub-id-type="doi">10.60797/IRJ.2025.162.73</article-id>
			<article-categories>
				<subj-group>
					<subject>Brief communication</subject>
				</subj-group>
			</article-categories>
			<title-group>
				<article-title>Разработка программного модуля для параллельной обработки пространственных запросов в PostgreSQL с использованием .NET и PostGIS</article-title>
			</title-group>
			<contrib-group>
				<contrib contrib-type="author" corresp="yes">
					<contrib-id contrib-id-type="orcid">https://orcid.org/0009-0003-0741-1734</contrib-id>
					<contrib-id contrib-id-type="rinc">https://elibrary.ru/author_profile.asp?id=1059450</contrib-id>
					<contrib-id contrib-id-type="rid">https://publons.com/researcher/HHS-7413-2022</contrib-id>
					<name>
						<surname>Нуриев</surname>
						<given-names>Марат Гумерович</given-names>
					</name>
					<email>mgnuriev@kai.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
				<contrib contrib-type="author">
					<name>
						<surname>Лаптева</surname>
						<given-names>Марина Геннадьевна</given-names>
					</name>
					<email>marinnay1@mail.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
				<contrib contrib-type="author">
					<name>
						<surname>Панченко</surname>
						<given-names>Оксана Владимировна</given-names>
					</name>
					<email>ov_panchenko@mail.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
				<contrib contrib-type="author">
					<contrib-id contrib-id-type="rinc">https://elibrary.ru/author_profile.asp?id=845291</contrib-id>
					<name>
						<surname>Пикулев</surname>
						<given-names>Андрей Николаевич</given-names>
					</name>
					<email>anpikulev@mail.ru</email>
					<xref ref-type="aff" rid="aff-1">1</xref>
				</contrib>
			</contrib-group>
			<aff id="aff-1">
				<label>1</label>
				<institution>Казанский национальный исследовательский технический университет им. А.Н. Туполева – КАИ</institution>
			</aff>
			<pub-date publication-format="electronic" date-type="pub" iso-8601-date="2025-12-17">
				<day>17</day>
				<month>12</month>
				<year>2025</year>
			</pub-date>
			<pub-date pub-type="collection">
				<year>2025</year>
			</pub-date>
			<volume>16</volume>
			<issue>162</issue>
			<fpage>1</fpage>
			<lpage>16</lpage>
			<history>
				<date date-type="received" iso-8601-date="2025-08-17">
					<day>17</day>
					<month>08</month>
					<year>2025</year>
				</date>
				<date date-type="accepted" iso-8601-date="2025-10-06">
					<day>06</day>
					<month>10</month>
					<year>2025</year>
				</date>
			</history>
			<permissions>
				<copyright-statement>Copyright: &amp;#x00A9; 2022 The Author(s)</copyright-statement>
				<copyright-year>2022</copyright-year>
				<license license-type="open-access" xlink:href="http://creativecommons.org/licenses/by/4.0/">
					<license-p>
						This is an open-access article distributed under the terms of the Creative Commons Attribution 4.0 International License (CC-BY 4.0), which permits unrestricted use, distribution, and reproduction in any medium, provided the original author and source are credited. See 
						<uri xlink:href="http://creativecommons.org/licenses/by/4.0/">http://creativecommons.org/licenses/by/4.0/</uri>
					</license-p>
					.
				</license>
			</permissions>
			<self-uri xlink:href="https://research-journal.org/archive/12-162-2025-december/10.60797/IRJ.2025.162.73"/>
			<abstract>
				<p>В статье представлена разработка программного модуля для параллельной обработки пространственных запросов в системе управления базами данных PostgreSQL с расширением PostGIS, реализованного на платформе .NET. Решение основано на паттерне «Производитель-Потребитель» и механизме кэширования результатов в формате GeoJSON, что позволяет значительно снизить нагрузку на систему управления базами данных и ускорить время отклика при повторных запросах. Описан процесс нормализации SQL-запросов, генерации хэш-кодов с использованием алгоритма SHA-256 и формирования выходных файлов. Проведён анализ существующих решений, выявлены их ограничения в области параллельной обработки запросов. Представлены результаты тестирования на различных пространственных базах данных, подтвердившие повышение производительности и масштабируемости системы. Рассмотрены перспективы дальнейшего развития модуля, включая распределённую архитектуру, интеллектуальное прогнозирование частоты запросов и расширение функциональности веб-интерфейса.</p>
			</abstract>
			<kwd-group>
				<kwd>PostgreSQL</kwd>
				<kwd> PostGIS</kwd>
				<kwd> параллельная обработка</kwd>
				<kwd> пространственные данные</kwd>
				<kwd> .NET</kwd>
				<kwd> кэширование</kwd>
				<kwd> GeoJSON</kwd>
				<kwd> производитель-потребитель</kwd>
				<kwd> нормализация запросов</kwd>
				<kwd> SHA-256</kwd>
				<kwd> GIS</kwd>
				<kwd> многопоточность</kwd>
			</kwd-group>
		</article-meta>
	</front>
	<body>
		<sec>
			<title>HTML-content</title>
			<p>1. Введение</p>
			<p>В современном мире геопространственные данные играют ключевую роль в различных областях, таких как транспорт, экология, урбанистика, логистика и управление природными ресурсами. С развитием технологий дистанционного зондирования Земли, GPS и Интернета вещей (IoT) объемы геоданных увеличиваются экспоненциально. Это создает необходимость в эффективных методах их обработки и анализа. Одной из наиболее популярных систем для работы с геопространственными данными является PostgreSQL с расширением PostGIS, которое предоставляет широкий набор функций для выполнения пространственных запросов </p>
			<p>[1][2][3]</p>
			<p>PostGIS соответствует стандартам Open Geospatial Consortium (OGC) и поддерживает сложные операции: буферизацию, пересечения, вычисления площадей и расстояний </p>
			<p>[4][5]</p>
			<p>Однако, несмотря на свои возможности, традиционные подходы к обработке запросов могут не справляться с увеличивающимися нагрузками, особенно в условиях многопользовательской среды. Разработка модуля, который позволяет обрабатывать несколько запросов параллельно, может значительно повысить эффективность работы с пространственными данными.</p>
			<p>Новизна работы заключается в создании программного компонента на базе .NET для интеграции с PostgreSQL, обеспечивающего параллельную обработку пространственных запросов. Данный подход позволит оптимизировать использование ресурсов системы, а также сократить время отклика на запросы, что особенно важно для пользователей, работающих с большими объемами пространственной информации. В то же время разработка программного компонента на базе .NET обеспечит простоту внедрения в существующие программные комплексы, что существенно расширяет круг потенциальных пользователей решения.</p>
			<p>Целью данной работы является разработка программного модуля, обеспечивающего параллельную обработку множества пространственных запросов в системе управления базами данных PostgreSQL.</p>
			<p>Задачи работы:</p>
			<p>- исследование существующих аналогов;</p>
			<p>- разработка программного модуля;</p>
			<p>- тестирование и отладка разработанного модуля на реальных базах данных.</p>
			<p>Внедрение разрабатываемого модуля позволит значительно увеличить пропускную способность существующих геоинформационных систем без замены системы управления базами данных, что особенно важно в условиях ограниченных бюджетов. Решение найдет применение в транспортной логистике, градостроительном планировании, экологическом мониторинге и других областях, где требуется обработка больших объемов пространственных данных в режиме реального времени. В связи с развитием технологий искусственного интеллекта, которые основаны на обработке больших данных, эти исследования и разработки особенно актуальны.</p>
			<p>2. Анализ аналогов</p>
			<p>При выборе подхода к параллельной обработке запросов важно понимать, какие решения уже существуют и какие ограничения они имеют. Давайте рассмотрим три ключевых инструмента, которые часто используются в связке с PostgreSQL, но не решают проблему параллелизма в полной мере.</p>
			<p>1. Поддержка параллелизма в PostgreSQL. Начиная с версии 9.6 СУБД PostgreSQL стала поддерживать параллельное выполнение запроса, что значительно улучшает производительность при обработке больших объемов данных, однако архитектурные ограничения не позволяют выполнять параллельную обработку нескольких независимых запросов в рамках одного однопользовательского соединения. Это фундаментальное ограничение связано с моделью выполнения запросов, где каждое соединение обслуживается отдельным процессом, обрабатывающим запросы строго последовательно, для обеспечения согласованности данных и предсказуемости работы. Это обеспечивает стабильность и соблюдение ACID-свойств, но накладывает определенные ограничения на параллелизм </p>
			<p>[6][7]</p>
			<p>2. Pgpool-II — это промежуточное программное обеспечение для PostgreSQL, который позволяет администраторам управлять пулами соединений БД и реализовывать репликацию данных между серверами БД. Pgpool-II работает как прокси-сервер между клиентскими приложениями и серверами PostgreSQL, перехватывая запросы от клиентов и направляя их к соответствующим серверам БД согласно настроенным правилам и политикам </p>
			<p>[8][9]</p>
			<p>- Дополнительный слой сложности: PgPool-II требует отдельной настройки и обслуживания как промежуточного прокси-сервера, что увеличивает инфраструктурные затраты. В то время как прямое управление соединениями через Npgsql в коде C# даёт полный контроль без зависимостей от внешних компонентов.</p>
			<p>- Задержки для коротких запросов: для высоконагруженных сценариев с миллионами быстрых запросов PgPool-II может стать узким местом из-за накладных расходов на маршрутизацию. Прямые подключения через Npgsql минимизируют задержки.</p>
			<p>3. PgAdmin и Dbeaver. Данные инструменты предоставляют удобные интерфейсы для работы с PostgreSQL с расширением PostGIS для работы с пространственными данными, но не поддерживают асинхронную параллельную обработку запросов. Данные программы в основном предназначены для синхронного выполнения запросов </p>
			<p>[10][11]</p>
			<p>Как показал наш анализ, ни в одной из этих СУБД не реализованы технологии параллельной обработки запросов к базам данных.</p>
			<p>3. Проектирование модуля</p>
			<p>Проектная часть работы направлена на создание программного модуля, обеспечивающего параллельную обработку пространственных запросов в базу данных PostgreSQL. Основная цель — преодоление ограничений стандартных подходов к выполнению запросов в условиях высокой нагрузки и многопользовательского доступа.</p>
			<p>Для полноценного представления работы программного модуля также будет проектироваться и разрабатываться упрощённая версия клиентской части системы «клиент-сервер», отображающая алгоритм работы со стороны обычного пользователя этой базы данных. Система «клиент-сервер» подразумевает использование клиент-серверной архитектуры — это модель организации вычислительных систем, в которой задачи распределены между клиентами и серверами. Основные компоненты:</p>
			<p>- Клиенты — это устройства или приложения, которые запрашивают информацию или услугу у сервера. Клиенты могут быть как программными приложениями (например, веб-браузеры, мобильные приложения), так и аппаратными устройствами (например, смартфоны, планшеты, терминалы). В нашем случае клиентская часть системы будет отвечать за отправление запросов и визуализацию полученных ответов.</p>
			<p>- Сервер — это компьютер, который предоставляет запрашиваемую информацию или услугу клиентам. Серверы могут выполнять различные функции, такие как хранение данных, обработка запросов, вычисления и т. д.</p>
			<p>Для обеспечения повышенной производительности по сравнению с последовательным режимом работы, узким местом которого являются задержка и ожидание завершения работы над текущей задачей перед переходом к следующей, необходима бесперебойная работа системы, а именно параллельная асинхронная обработка запросов. Для достижения этой цели предлагается использовать такой паттерн, как «Производитель-Потребитель» — это шаблон проектирования, который организует параллельную обработку задач, разделяя систему на два ключевых компонента: производителей (producers) и потребителей (consumers). Производители — отвечают за генерацию данных или задач, помещают элементы в общий буфер или очередь. Потребители — отвечают за обработку данных или задач, извлекают элементы из общего буфера или очереди. Буфер/очередь — общая структура данных, которая выступает посредником между производителем и потребителем, хранит произведённые элементы до их потребления, обеспечивая баланс между скоростью их создания и обработки.</p>
			<p>Несмотря на индивидуальность каждого пользователя и его причины для написания того или иного запроса к базе данных, есть не малая вероятность поступления одинаковых или же повторяющихся запросов, не обязательно идущих подряд. Они могут приходить с некими временными интервалами, будь то считанные секунды, минуты, а может и часы. По этой причине, а также и для достижения ещё большей производительности возникает необходимость кэширования результатов запросов. Кэширование представляет собой процесс хранения копий данных во временном хранилище (кэше) для быстрого доступа к ним в будущем. Таким образом, результат каждого запроса будет храниться в кэш-памяти сервера на протяжении заранее установленного времени, после которого будет удалён из кэш-памяти. При поступлении же этого запроса повторно до окончания этого промежутка времени, уже обработанный результат этого запроса будет немедленно передан клиенту без запроса к базе данных, при этом внутренний таймер данного запроса обновиться и отсчёт времени начнётся заново.</p>
			<p>Для описания работы программы следует построить UML-диаграмму последовательности, но для начала давайте разберёмся, что она из себя представляет и как её читать. Диаграмма последовательности или же взаимодействия (interaction diagram) описывает взаимодействие групп объектов в различных условиях их поведения </p>
			<p>[12][13]</p>
			<p>- Объекты (участники): представлены прямоугольниками с названием. Каждый объект соответствует компоненту системы.</p>
			<p>- Линии жизни: вертикальные пунктирные линии, показывающие период активности объекта.</p>
			<p>- Сообщения: стрелки между линиями жизни, обозначающие передачу или вызов методов.</p>
			<p>- Фрагменты взаимодействия: блоки, структурирующие логику. Мы будем использовать такие блоки как:</p>
			<p>- «par» (параллельно) — обозначает параллельное выполнение операций.</p>
			<p>- «alt» (альтернативно) — указывает на условные ветвления.</p>
			<p>Исходя из этого мы можем построить UML диаграмму (рисунок 1).</p>
			<fig id="F1">
				<label>Figure 1</label>
				<caption>
					<p>Диаграмма последовательности алгоритма работы программы</p>
				</caption>
				<alt-text>Диаграмма последовательности алгоритма работы программы</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/e2f42beb-f82c-4a21-8f5a-594b5e7b6aa4.jpg"/>
			</fig>
			<p>Клиентские приложения (Клиент 1, Клиент 2 и Клиент N) инициируют работу системы, отправляя SQL запросы к пространственным данным. Пример пространственного SQL запроса представлен в листинге 1.</p>
			<p>Листинг 1 — Пример пространственного SQL запроса</p>
			<p>Подобные запросы поступают в программный модуль, который выступает центральным координатором системы. Важно отметить, что модуль принимает запросы от неограниченного количества клиентов одновременно, что подчёркивает масштабируемость решения.</p>
			<p>Программный модуль выполняет критически важную функцию диспетчеризации  он не обрабатывает запросы самостоятельно, а распределяет их в пул потоков. Схематичное представление принципа работы пула потоков приведено на рисунке 2. Такой подход позволяет оптимально использовать вычислительные ресурсы сервера. Пул потоков обеспечивает истинную параллельность обработки  каждый запрос выполняется в отдельном потоке, при этом система автоматически балансирует нагрузку между доступными ядрами процессора.</p>
			<fig id="F2">
				<label>Figure 2</label>
				<caption>
					<p>Схема работы пула потоков</p>
				</caption>
				<alt-text>Схема работы пула потоков</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/fc2b2271-c01b-486f-9255-59760a4bfafb.png"/>
			</fig>
			<p>На следующем этапе каждый поток из пула читает свой SQL запрос, нормализует его, то есть приводит запрос к единому стандартному виду, чтобы устранить различия в форматировании (лишние пробелы, переносы строк, регистр). На основе нормализованного запроса формируется хэш-код [14], [15]. Примеры хэш-кодов, полученных кодированием по алгоритму SHA-256 представлены в таблице.</p>
			<table-wrap id="T1">
				<label>Table 1</label>
				<caption>
					<p>Примеры хэширования</p>
				</caption>
				<table>
					<tr>
						<td>Входные данные</td>
						<td>Выход хэша</td>
					</tr>
					<tr>
						<td>Меня зовут Тоби</td>
						<td>cacb5418163039b016be9746818a2926f68fd1e4bad1b04f6791f6aabb5e8c52</td>
					</tr>
					<tr>
						<td>Меня зовут Тони</td>
						<td>9cd2444dc56929bdb97123add1f007643effa88bf1ed061eee1eead4e15ac7f9</td>
					</tr>
					<tr>
						<td>Меня зовут Тоби, и это мой проект</td>
						<td>9abbaa0c54fcd028ac51bede2608d06e8d3a026784e34adfac14fadd143d212c</td>
					</tr>
				</table>
			</table-wrap>
			<p>На основе этого хэш-кода, как по ключу, происходит поиск готового результата в кэше. В результате этого поиска возможны два исхода:</p>
			<p>1. Если результат найден, он выгружается из кэша и сохраняется в виде GeoJSON файла, пропуская этап с обращением к базе данных PostgreSQL + PostGIS и обработкой запроса.</p>
			<p>2. Если совпадений по поиску нет  запрос выполняется в СУБД. Программа независимо взаимодействуют с СУБД PostgreSQL, расширенной функционалом PostGIS для работы с геоданными. Это взаимодействие включает выполнение пространственных запросов, например таких как расчёты расстояний, анализ пересечений географических объектов или выборки данных по пространственным критериям. После выполнения каждого запроса PostgreSQL возвращает результаты в табличном формате, которые дальше претерпевают преобразование полученных табличных данных в стандартизированный формат GeoJSON [16], [17], которые пул потоков передаёт обратно в основной программный модуль. Пример GeoJSON файла представлен в листинге 2.</p>
			<p>Листинг 2 — Файл NewYork.geojson</p>
			<p>Завершающая стадия работы системы включает кэширование полученного GeoJSON файла. </p>
			<p>Использование кэширования сокращает время отклика для повторяющихся запросов и снижает нагрузку на базу данных. П[18][19]</p>
			<p>Важно подчеркнуть, что вся обработка в потоках происходит асинхронно – клиенты получают результаты по мере готовности, без блокировки основного потока выполнения.</p>
			<p>4. Реализация проекта</p>
			<p>Основной задачей модуля является эффективная обработки множества запросов одновременно. Для этого была реализована система, основанная на паттерне «Производитель-Потребитель», где:</p>
			<p>- производитель — мониторит директорию с SQL запросами и добавляет их в очередь;</p>
			<p>- потребитель — представляет собой пул потоков, выполняющий запросы к базе данных.</p>
			<p>Данный паттерн был реализован через механизмы библиотеки Task Parallel Library (TPL) и «BlockingCollection&lt;Task&gt;» в .NET, что обеспечивает потокобезопасную организацию очереди задач, а также позволяет эффективно распределять задачи между потоками, используя ресурсы процессора и задавать границы, ограничивая максимальную ёмкость коллекции </p>
			<p>[20][21]</p>
			<p>Листинг 3 — Цикл для проверки новых запросов</p>
			<p> </p>
			<p>Метод «ProcessAvailableQueriesAsync» (листинг 4) в свою очередь сканирует директорию с SQL запросами и создаёт задачи обработки, которые добавляются в очередь через «_taskQueue.Add()».</p>
			<p>Листинг 4 — Метод «ProcessAvailableQueriesAsync»</p>
			<p>Метод «.GetFiles()» в нашем коде принимает два параметра:</p>
			<p>- путь к директории, который является обязательным параметром;</p>
			<p>- шаблон поиска или же фильтр — параметр, позволяет фильтровать файлы по конкретным критериям, в данном случае по расширению файла «.sql».</p>
			<p>Потребители (листинг 5) реализованы как пул из определённого числа фоновых задач (число задач устанавливается администратором), запускаемых через «Task.Run», которые, в свою очередь, непрерывно извлекают и выполняют задачи из очереди с помощью метода «GetConsumingEnumerable()», обеспечивая параллельное выполнение заданного числа запросов одновременно.</p>
			<p>Листинг 5 — Потребитель задач</p>
			<p>Нормализация SQL запросов и генерация хэша — критически важные этапы для корректной работы кэширования. Давайте рассмотрим их более подробно.</p>
			<p>Нормализация запросов — это процесс приведения SQL запроса к унифицированному формату, который позволяет идентифицировать семантически идентичные запросы, даже если они имеют синтаксические различия </p>
			<p>[22][23]</p>
			<p>Процесс нормализацию в свою очередь состоит из нескольких ключевых операций:</p>
			<p>Любой SQL запрос может содержать случайные пробелы, табуляции или переносы строк, которые не оказывают никакого влияния на его смысл, но делают его уникальным для системы. Для примера рассмотрим два SQL запроса с незначащими пробелами и без незначащих пробелов (листинг 6):</p>
			<p>Листинг 6 — Примеры запросов</p>
			<p>Фактически это два одинаковых запроса, результаты обработки которых будут полностью идентичны, однако технически эти запросы различаются. Что приводит к излишней нагрузке системы и соответственно снижению производительности, которой можно было бы избежать. Для этого следует предпринять следующие действия:</p>
			<p>- все последовательности пробелов заменить на один пробел;</p>
			<p>- специальные управляющие последовательности (escape sequences), которые используются для записи пробельных (непечатных) символов (whitespace characters), а именно символы переноса строк «\r\n», «\n» и табуляции «\t» заменяются на один пробел;</p>
			<p>- удаляются пробелы в начале и конце строки (для выполнения данной операции существует метод «.Trim()»).</p>
			<p>Код реализующий эти действия представлен в листинге 7, где используется метод «Replace» класса «Regex», а также одноимённый метод, но и из класса «String». Использование метода «Regex.Replace()» с регулярным выражением «\s+» гарантирует, что между словами всегда будет не более одного пробела.</p>
			<p>Листинг 7 — Удаление лишних пробелов и переносов строк</p>
			<p>SQL запросы нечувствительны к регистру ключевых слов, таких как SELECT, FROM, WHERE и другие, то есть такие слова как SELECT и select являются эквивалентными. Приведение к нижнему регистру стандартизирует запросы, уменьшая количество всевозможных уникальных запросов и тем самым значительно снижая количество хранимых в кэш-памяти файлов-дубликатов с результатами одних и тех же запросов </p>
			<p>[24][25]</p>
			<p>Листинг 8 — Примеры запросов с разными регистрами</p>
			<p>Однако стоит учесть, что это не затрагивает строковые литералы и идентификаторы в кавычках (например WHERE name = «Москва»), что важно для сохранения семантики. То есть запросы, где текст внутри кавычек написан в нижнем регистре и в верхнем регистре не будут считаться идентичными, а значит и результаты этих запросов могут отличаться, в зависимости от того был ли предусмотрен данный аспект в базе данных (листинг 9).</p>
			<p>Листинг 9 — Пример запроса с нижним регистром</p>
			<p>Комментарии в SQL запросах — это текстовые пояснения, которые игнорируются СУБД при выполнении, но могут влиять на уникальность хэша запроса. Например, два семантически одинаковых запроса с разными комментариями будут считаться разными, что приведёт к промахам кэша и избыточной нагрузке на БД. Удаление комментариев – важный этап нормализации для обеспечения корректной работы системы кэширования.</p>
			<p>Примеры запросов до нормализации и после нормализации представлены в листингах 10 и 11 соответственно.</p>
			<p>Листинг 10 — Пример запроса до нормализации</p>
			<p>Листинг 11 – Запрос после нормализации</p>
			<p>Далее будет описан процесс по генерации хэш-кода запроса.</p>
			<p>Генерация хэш-кода — завершающий этап подготовки SQL запроса к кэшированию. Этот процесс преобразует нормализованную строку запроса в уникальный идентификатор, который используется для быстрого поиска результатов в кэше. Основная задача хэш-функции — обеспечить минимальную вероятность коллизий (ситуаций, когда разные запросы получают одинаковый хэш) при сохранении высокой производительности.</p>
			<p>Для кодирования был выбран алгоритм SHA-256 в качестве основы для генерации хэш-кода. Причина такого выбора обусловлена криптографической устойчивостью и широкому применению в современных системах. SHA-256 преобразует входные данные в 256-битный (32-байтовый) хэш, который практически исключает вероятность коллизии для различных входных строк. Такой подход сокращает объём полезных данных и ускоряет сравнение ключей, сохраняя при этом достаточный уровень уникальности.</p>
			<p>Сам же процесс генерации хэш-кода начинается с преобразования полученной ранее нормализованной строки запроса в массив байтов с использованием кодировки UTF-8. Для выполнения данного преобразования используется метод «Encoding.UTF8.GetBytes(normalizedQuery)», где «normalizedQuery» — это строка полученная после всех этапов нормализации. Затем для полученного массива байтов вычисляется хэш-сумма с помощью метода «ComputeHash» экземпляра «sha256». Полученный массив «hashBytes»преобразуется в строку с помощью метода «BitConverter.ToString(hashBytes, 0, 8)». Входными параметрами данного метода являются:</p>
			<p>- «hashBytes» — массив байтов;</p>
			<p>- «0» — индекс символа начала строки;</p>
			<p>- «8» — длина строки, которую мы хотим получить.</p>
			<p>Выходным параметром является строка в шестнадцатеричном формате, разделённая дефисами. В дальнейшем для удаления этих дефисов мы применим метод с заданными входными параметрами «Replace(“-”, “”)», в результате чего получим непрерывную шестнадцатеричную строку, однако, чтобы уменьшить количество возможных вариантов и тем самым оптимизировать скорость проверки кэш на поиск файлов с этим же хэш-кодом, мы приведём все символы к нижнему регистру с помощью метода «ToLower()». В результате всех этих преобразований мы получим уникальный идентификатор для каждого запроса — хэш-код. Полный листинг функции по генерации хэш-кода представлен в листинге 12.</p>
			<p>Листинг 12 — Генерация хэш-кода</p>
			<p>Сгенерированный хэш-код используется как часть имени файла для сохранения результатов в формате GeoJSON, что гарантирует, что повторяющиеся запросы будут ссылаться на один и тот же файл, даже если исходный текст запроса отличался незначительными синтаксическими вариациями. А с учётом того, что данный GeoJSON также будет храниться в кэше, то хэш-код, записанный в имени этого файла, будет служить ключом для проверки был ли уже выполнен данный запрос ранее.</p>
			<p>Что же касается остальной части имени каждого GeoJSON файла, то она формируется из уже полученной нами нормализованной строки. Данная строка обрезается до 100 символов, из неё удаляются недопустимые символы, которые нельзя использовать при переименовании файла, а пробелы заменяются на подчёркивания. Описанное преобразование обеспечивает читаемость имени файла и добавляет дополнительный уровень защиты от конфликтов, например «использование недопустимых символов при переименовании файла». Для примера рассмотрим запрос, представленный в листинге 13.</p>
			<p>Листинг 13 — Пример SQL запроса</p>
			<p>Этот запрос выбирает все поля для объекта из таблицы «ne_10m_populated_placesz8» из схемы «public», где поле «name» принимает значение «Kazan». Путём описанных выше преобразований мы получаем следующее имя для этого файла:</p>
			<p>select_from_public.ne_10m_populated_placesz8_where_public.ne_10m_populated_placesz8.name_=_'Kazan'_51f3ca9b69a80c00</p>
			<p>Полный код этого ключевого элемента отвечающий и за нормализацию и за генерацию хэш-кода, а также за формирование имени файла представлен в листинге 14. В этом элементе также используется функция «RemoveCommentsOptimized», отвечающая за удаление комментариев всех видов. На этом моменте реализация второго ключевого элемента отвечающего за нормализацию и генерацию хэша, а также за формирование имени выходного файла завершается.</p>
			<p>Листинг 14 — Функция нормализации и генерации хэша</p>
			<p>Взаимодействие с базой данных обязательный элемент данного программного модуля. Осуществляться оно будет с помощью библиотеки Npgsql, которая предоставляет асинхронные методы для выполнения запросов и работы с геопространственными данными. Также будет использоваться расширение «NetTopologySuite», интегрированное в «Npgsql». Данное расширение позволяет преобразовывать результаты запросов в пространственные объекты типа «Geometry» (точки, линии, полигоны), которые затем сериализуются в формат GeoJSON. Выполняться весь процесс взаимодействия будет в рамках метода «ExecuteQueryToGeoJsonAsync», входными параметрами которого являются строка подключения к базе данных и сам SQL запрос, а выходным параметром результант запроса в формате GeoJSON файла.</p>
			<p>Настройка подключения начинается с создания экземпляра «NpgsqlDataSourceBuilder», где указывается строка подключения к базе данных:</p>
			<p>Host=localhost;Username=postgres;Password=123;Database=DatabaseName</p>
			<p>В данной строке указывается адрес сервера, в данном случае это локальный хост, имя пользователя для подключения к базе данных — «postgres», пароль пользователя — «123» и название конкретной базы данных — «DatabaseName», к которой происходит подключение.</p>
			<p>После создания экземпляра и подключения к базе данных вызывается метод «UseNetTopologySuite()» из ранее упомянутого расширения для активации поддержки геопространственных типов данных PostGIS. Далее нужно обеспечить выполнение асинхронного подключения к базе данных, для этого будет использован метод «OpenConnectionAsync()», что позволяет не блокировать основной поток при ожидании ответа от СУБД. Установка «CommandTimeout = 300» гарантирует, что запросы длительностью до 300 секунд не будут прерваны раньше времени. Данную настройку следует изменить в зависимости от размеров базы данных и сложности запросов, в связи с чем она может настраиваться индивидуально для каждой базы данных.</p>
			<p>После успешного выполнения запроса происходит чтение результата с помощью «NpgsqlDataReader», который последовательно обрабатывает каждую строку результата, и в цикле с помощью «await reader.ReadAsync()» извлекаются значения из столбцов. Если столбец содержит геометрию, то есть является типом «Geometry», то значения данного столбца сохраняются отдельно для последующего преобразования в GeoJSON, все остальные атрибуты добавляются в коллекцию свойств «properties» объекта.</p>
			<p>Преобразование результатов в GeoJSON выполняется с использованием метода «Wrtie(geometry)» класса «GeoJsonWriter» из «NetTopologySuite». Данный метод сериализует геометрию в JSON-совместимый формат, а благодаря «JsonSerializer» из класса «Systems.Text.Json» собирает полный объект «FeatureCollection» – объект JSON, содержащий коллекцию функцию GeoJSON.</p>
			<p>Настройка «UnsafeRelaxedJsonEscaping» отключает экранирование символов, то есть замена в тексте управляющих (служебных) символов на соответствующие им последовательности символов, что важно для корректного отображения координат в веб-клиентах.</p>
			<p>Также для представления полной картины взаимодействия с базой данных с клиентской стороны был реализован небольшой сайт способный отправлять SQL запросы и принимать GeoJSON результаты, при этом визуализируя их на карте мира.</p>
			<p>Алгоритм действий для работы с сайтом следующий:</p>
			<fig id="F3">
				<label>Figure 3</label>
				<caption>
					<p>Домашняя страница сайта</p>
				</caption>
				<alt-text>Домашняя страница сайта</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/1424b2fb-053a-43cd-a909-35a915febffa.png"/>
			</fig>
			<fig id="F4">
				<label>Figure 4</label>
				<caption>
					<p>Страница регистрации</p>
				</caption>
				<alt-text>Страница регистрации</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/0e7e004d-e7a4-44a3-8d35-4998945561fb.png"/>
			</fig>
			<fig id="F5">
				<label>Figure 5</label>
				<caption>
					<p>Страница для входа в аккаунт</p>
				</caption>
				<alt-text>Страница для входа в аккаунт</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/ad109ff2-c656-4825-819e-43b7ea902883.png"/>
			</fig>
			<p>1. При первом заходе на сайт вас встречает домашняя страница (рисунок 3). На ней есть 2 кнопки «Login» и «Register», при нажатии на которые вы перейдёте на страницу для входа или регистрации соответственно. Мы же для примера перейдём по кнопке «Register».2. На странице регистрации нас встречают 3 поля, которые нужно заполнить для прохождения регистрации (рисунок 4). После успешной регистрации мы перейдём на страницу входа.3. На странице входа в профиль мы должны повторить введённые нами при регистрации данные и успешно войти в аккаунт (рисунок 5). Все данные об аккаунтах сохраняются в отдельный JSON файл, а их пароли шифруются, что позволяет избежать их потери даже при перезапуске сервера.</p>
			<p>Листинг 15 — Пример пространственного SQL запроса</p>
			<p>Данный запрос ищет в базе данных «NaturalEarth» в таблице «ne_10m_admin_1 z8» объект, у которого в поле «name» содержится запись «Grodno».</p>
			<fig id="F6">
				<label>Figure 6</label>
				<caption>
					<p>Страница для обработки запросов</p>
				</caption>
				<alt-text>Страница для обработки запросов</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/e30ff38d-b0c3-4edb-b1ee-8aec761065dc.png"/>
			</fig>
			<fig id="F7">
				<label>Figure 7</label>
				<caption>
					<p>Визуализация результата SQL запроса</p>
				</caption>
				<alt-text>Визуализация результата SQL запроса</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/d706ce5c-8da1-4db3-9811-f498e0664a0f.png"/>
			</fig>
			<fig id="F8">
				<label>Figure 8</label>
				<caption>
					<p>Список свойств выбранного объекта</p>
				</caption>
				<alt-text>Список свойств выбранного объекта</alt-text>
				<graphic ns0:href="/media/images/2025-11-21/fcbb2cb3-4c11-4653-98ac-f34bcd025160.png"/>
			</fig>
			<p>Как видно из рисунка 7, данный объект является полигоном и представляет собой город Гродно, расположенный в Республике Беларусь. Если же мы нажмём мышкой на этот полигон появится список его свойств из базы данных (рисунок 8).</p>
			<p>5. Тестирование</p>
			<p>Разработанный программный модуль был протестирован на производительность и корректность работы ключевых компонентов. Основное внимание уделялось проверке параллельной обработке запросов и эффективности кэширования. Для тестирования были использованы различные базы данных PostgreSQL с расширением PostGIS, а именно:</p>
			<p>- База данных «NaturalEarth» содержащая информацию о городах, водоёмах, островах и многих других объектах планеты Земля. Источником этих данных является электронный ресурс «Natural Earth». Общий вес базы данных составляет 193 МБ.</p>
			<p>- База данных «Volga-fed-district» содержащая значительные объёмы пространственные данных Приволжского федерального округа. Источником этих данных является электронный ресурс «download.geofabrik.de» предоставляющий свободный доступ к пространственным данным OpenStreetMap. Общий вес базы данных составляет 4138 МБ.</p>
			<p>Для тестирования производилась практически единовременная отправка 20 запросов, в которых было 3 разных повторяющихся запроса. Запросы относились к разным данным из разных таблиц для каждой базы данных. При этом перед тестированием был выполнен 1 запрос для установления корректного подключения к базе данных, данный запрос не повторялся ни с одним из запросов, которые использовались для тестов.</p>
			<p>Результаты этих тестов следующие:</p>
			<p>1. Для базы данных «NaturalEarth». Время выполнения уникальных запросов составляет в среднем 214 миллисекунд на запрос, что превышает показатели последовательного режима обработки запросов (в среднем 127 миллисекунд на запрос) из-за дополнительных операций нормализации, генерации хэш-кода и управления потоками. Однако следует учитывать, что общее время последовательных запросов равно сумме времени выполнения всех запросов, в то время как в параллельном режиме работы общее время обработки всех запросов значительно ниже и практически равна времени обработки самого долгого процесса. Таким образом, за время выполнения в среднем 2–3 последовательных запроса, в параллельном же режиме уже успеют обработаться большая часть всех запросов, а при повышении вероятности повторяющихся запросов этот процесс в параллельном режиме будет выполняться ещё быстрее, так как вместо тех же 214 миллисекунд на обработку запроса результат, которого имеется в кэше, затрачивается всего 5 миллисекунд.</p>
			<p>2. Для базы данных «Volga-fed-district». Время выполнения 20 запросов разной степени сложности с 3 повторяющимися запросами в последовательном режиме суммарно составляет 14,802 секунды, в то время как выполнение этих же запросов в параллельном режиме, то есть при практически одновременной отправке этих запросов через сайт, в среднем происходит за 5,365 секунд. Это подтверждает эффективность реализации параллелизма и кэширования: повторяющиеся запросы, результаты которых уже находились в кэше, обрабатывались мгновенно, а распределение нагрузки между потоками позволило сократить общее время выполнения в 2,76 раза. Максимальное время обработки одного сложного запроса в параллельном режиме составило 5,565 секунды, что свидетельствует о корректной работе системы с ресурсоёмкими операциями.</p>
			<p>Результаты демонстрируют, что модуль успешно масштабируется для работы с большими объёмами данных, обеспечивая стабильную производительность даже при высокой нагрузке.</p>
			<p>6. Заключение</p>
			<p>В ходе проведённой работы была разработана программная система для параллельной обработки пространственных запросов в системе управления базами данных PostgreSQL с использованием расширения PostGIS и платформы .NET. Предложенное решение основано на применении паттерна «Производитель-Потребитель» в сочетании с механизмом кэширования результатов в формате GeoJSON, что позволило существенно снизить нагрузку на базу данных и обеспечить высокую скорость отклика при повторных обращениях.</p>
			<p>Проведённое тестирование показало, что разработанный модуль демонстрирует высокую масштабируемость и стабильную производительность даже при интенсивном потоке запросов. Для крупных наборов пространственных данных удалось сократить общее время обработки более чем в два раза по сравнению с последовательным режимом, а при высоком количестве повторяющихся запросов производительность возрастала ещё значительнее благодаря мгновенной выдаче уже кэшированных результатов.</p>
			<p>К числу основных достоинств разработанной системы относится возможность интеграции в существующую инфраструктуру без замены используемой базы данных, поддержка большого числа одновременных клиентских подключений, использование универсального формата передачи данных GeoJSON, обеспечивающего совместимость с популярными геоинформационными платформами и веб-сервисами, а также оптимизация работы за счёт нормализации запросов и предотвращения избыточных вычислений.</p>
			<p>Перспективы дальнейшего развития решения заключаются в создании распределённой архитектуры, обеспечивающей ещё более высокую пропускную способность и отказоустойчивость; внедрении алгоритмов интеллектуального анализа данных, позволяющих прогнозировать частоту запросов и заранее формировать кэш; расширении возможностей веб-интерфейса с реализацией визуального построения пространственных запросов; совершенствовании системы хранения кэша с применением высокопроизводительных технологий и механизмов репликации; внедрении гибкой приоритезации запросов в зависимости от их значимости; создании подсистемы мониторинга и аналитики, позволяющей отслеживать производительность, выявлять узкие места и адаптировать параметры работы модуля в зависимости от текущей нагрузки.</p>
			<p>Таким образом, разработанное решение не только обеспечивает значительное ускорение обработки пространственных запросов, но и формирует основу для построения масштабируемых геоинформационных систем, способных эффективно функционировать в условиях постоянного роста объёмов геоданных и ужесточения требований к скорости их анализа.</p>
		</sec>
		<sec sec-type="supplementary-material">
			<title>Additional File</title>
			<p>The additional file for this article can be found as follows:</p>
			<supplementary-material xmlns:xlink="http://www.w3.org/1999/xlink" id="S1" xlink:href="https://doi.org/10.5334/cpsy.78.s1">
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/21097.docx">21097.docx</inline-supplementary-material>]-->
				<!--[<inline-supplementary-material xlink:title="local_file" xlink:href="https://research-journal.org/media/articles/21097.pdf">21097.pdf</inline-supplementary-material>]-->
				<label>Online Supplementary Material</label>
				<caption>
					<p>
						Further description of analytic pipeline and patient demographic information. DOI:
						<italic>
							<uri>https://doi.org/10.60797/IRJ.2025.162.73</uri>
						</italic>
					</p>
				</caption>
			</supplementary-material>
		</sec>
	</body>
	<back>
		<ack>
			<title>Acknowledgements</title>
			<p/>
		</ack>
		<sec>
			<title>Competing Interests</title>
			<p/>
		</sec>
		<ref-list>
			<ref id="B1">
				<label>1</label>
				<mixed-citation publication-type="confproc">Ельшин Н.И. Методы обработки пространственных данных / Н.И. Ельшин, В.В. Куралесин // Молодежь и наука: шаг к успеху : Сборник научных статей 8-й Всероссийской научной конференции перспективных разработок молодых ученых. В 4-х томах, Курск, 20–21 марта 2025 года. — Курск: Университетская книга, 2025. — С. 126–129.</mixed-citation>
			</ref>
			<ref id="B2">
				<label>2</label>
				<mixed-citation publication-type="confproc">Иванченкова А.М. Тенденции развития геоинформационных систем / А.М. Иванченкова, Е.А. Нартова // Молодежный вектор развития аграрной науки : Материалы 76-й национальной научно-практической конференции студентов и магистрантов, Воронеж, 14 февраля 2025 года. — Воронеж: Воронежский государственный аграрный университет имени Императора Петра I, 2025. — С. 121–124.</mixed-citation>
			</ref>
			<ref id="B3">
				<label>3</label>
				<mixed-citation publication-type="confproc">Екубджонов Д.И. Исследование производительности технологий объектно-реляционного отображения при взаимодействии с Microsoft SQL Server / Д.И. Екубджонов, Р.Ф. Гибадуллин // Международный научно-исследовательский журнал. — 2024. — № 10 (148). — DOI: 10.60797/IRJ.2024.148.145.</mixed-citation>
			</ref>
			<ref id="B4">
				<label>4</label>
				<mixed-citation publication-type="confproc">Беляков С.Л. Прецедентный анализ образов в интеллектуальных геоинформационных системах / С.Л. Беляков, М.Л. Белякова, М.Н. Савельева // Информационные технологии. — 2013. — № 7. — С. 22–25.</mixed-citation>
			</ref>
			<ref id="B5">
				<label>5</label>
				<mixed-citation publication-type="confproc">Vaslavskaya I. The Use of Blockchain Technology for Transport and Logistics Systems in the Digital Economy / I. Vaslavskaya, I. Koshkina, R. Zaripova [et al.] // Finance, Economics, and Industry for Sustainable Development. — Springer Cham, 2024. — DOI: 10.1007/978-3-031-56380-5_16.</mixed-citation>
			</ref>
			<ref id="B6">
				<label>6</label>
				<mixed-citation publication-type="confproc">Тимофеева Н.Е. Универсальный алгоритм обработки запросов с использованием технологии параллельных вычислений / Н.Е. Тимофеева, К.А. Дмитриева // Научно-технический вестник Брянского государственного университета. — 2018. — № 2. — С. 211–217. — DOI: 10.22281/2413-9920-2018-04-02-211-217.</mixed-citation>
			</ref>
			<ref id="B7">
				<label>7</label>
				<mixed-citation publication-type="confproc">Шигабетдинова Д.И. Обнаружение и локализация утечек на нефтедобывающих объектах с помощью компьютерного зрения / Д.И. Шигабетдинова, З.М. Гизатуллин, М.П. Шлеймович // Вестник Технологического университета. — 2025. — Т. 28. — № 5. — С. 123–128. — DOI: 10.55421/3034-4689_2025_28_5_123.</mixed-citation>
			</ref>
			<ref id="B8">
				<label>8</label>
				<mixed-citation publication-type="confproc">Супрунов С. PostgreSQL: функции и триггеры / С. Супрунов // Системный администратор. — 2004. — № 10 (23). — С. 42–47.</mixed-citation>
			</ref>
			<ref id="B9">
				<label>9</label>
				<mixed-citation publication-type="confproc">Шарипов Р.Р. Разработка программного комплекса потокового шифра RC4 для обучающихся по дисциплине «криптография» / Р.Р. Шарипов, С.П. Макаров, А.А. Кассирова // Международный научно-исследовательский журнал. — 2024. — № 9 (147). — DOI: 10.60797/IRJ.2024.147.15.</mixed-citation>
			</ref>
			<ref id="B10">
				<label>10</label>
				<mixed-citation publication-type="confproc">Пашинин О.В. Оптимизация запросов к базам данных / О.В. Пашинин // Математические структуры и моделирование. — 2007. — № 17. — С. 100–107.</mixed-citation>
			</ref>
			<ref id="B11">
				<label>11</label>
				<mixed-citation publication-type="confproc">Шкиндеров М.С. Моделирование помехоустойчивости системы контроля и управления доступом при воздействии электростатического разряда / М.С. Шкиндеров, Р.Р. Мубараков // Труды МАИ. — 2021. — № 120. — DOI: 10.34759/trd-2021-120-12.</mixed-citation>
			</ref>
			<ref id="B12">
				<label>12</label>
				<mixed-citation publication-type="confproc">Новиков Ф.А. Язык описания диаграмм / Ф.А. Новиков, К.Б. Степанян // Информационно-управляющие системы. — 2007. — № 4 (29). — С. 28–36.</mixed-citation>
			</ref>
			<ref id="B13">
				<label>13</label>
				<mixed-citation publication-type="confproc">Шурдилов И.С. Разработка системы распознавания эмоций по лицевым выражениям на основе машинного обучения / И.С. Шурдилов, М.Г. Нуриев, М.Г. Лаптева [и др.] // Международный научно-исследовательский журнал. — 2025. — № 6 (156). — DOI: 10.60797/IRJ.2025.156.52.</mixed-citation>
			</ref>
			<ref id="B14">
				<label>14</label>
				<mixed-citation publication-type="confproc">Корсунов Н.И. Защита информации баз данных, хранящихся на удаленных серверах / Н.И. Корсунов, А.И. Титов // Вопросы радиоэлектроники. — 2012. — Т. 4. — № 1. — С. 180–186.</mixed-citation>
			</ref>
			<ref id="B15">
				<label>15</label>
				<mixed-citation publication-type="confproc">Катасёв А.С. Нейронечеткая модель и программный комплекс автоматизации формирования нечетких правил для оценки состояния объектов / А.С. Катасёв // Автоматизация процессов управления. — 2019. — № 1 (55). — С. 21–29.</mixed-citation>
			</ref>
			<ref id="B16">
				<label>16</label>
				<mixed-citation publication-type="confproc">Лебедев А.Ю. Создание централизованного каталога алгоритмов обработки геоданных / А.Ю. Лебедев, А.Е. Березко // Геоинформатика. — 2010. — № 2. — С. 67–70.</mixed-citation>
			</ref>
			<ref id="B17">
				<label>17</label>
				<mixed-citation publication-type="confproc">Шакирзянов Р.М. Метод автоматического позиционирования беспилотных аппаратов на основе распознавания сигнальных радиально-симметричных маркеров подводных целей / Р.М. Шакирзянов, М.П. Шлеймович, С.В. Новикова // Автоматика и телемеханика. — 2023. — № 7. — С. 93–120. — DOI: 10.31857/S0005231023070061.</mixed-citation>
			</ref>
			<ref id="B18">
				<label>18</label>
				<mixed-citation publication-type="confproc">Гинзбург И.Б. Отказоустойчивые веб-интерфейсы для геоинформационных систем с использованием данных дистанционного зондирования Земли / И.Б. Гинзбург // Научно-технический вестник Поволжья. — 2016. — № 4. — С. 72–75.</mixed-citation>
			</ref>
			<ref id="B19">
				<label>19</label>
				<mixed-citation publication-type="confproc">Смирнов Ю.Н. Математическая модель оптимизации деятельности для цифровой системы управления предприятием / Ю.Н. Смирнов, А.В. Каляшина // Научно-технический вестник Поволжья. — 2023. — № 11. — С. 119–122.</mixed-citation>
			</ref>
			<ref id="B20">
				<label>20</label>
				<mixed-citation publication-type="confproc">Гибадуллин Р.Ф. Оптимизация асинхронных операций в .NET / Р.Ф. Гибадуллин, Д.А. Гашигуллин // Международный научно-исследовательский журнал. — 2025. — № 7(157). — DOI: 10.60797/IRJ.2025.157.40.</mixed-citation>
			</ref>
			<ref id="B21">
				<label>21</label>
				<mixed-citation publication-type="confproc">Хабибуллин Ф.Ф. Анализ параметров ошибки положения, перемещения идеального и реального механизма для робототехнических систем / Ф.Ф. Хабибуллин, Р.Т. Исламов, Л.Ф. Хабибуллина // Проблемы машиностроения и автоматизации. — 2024. — № 1. — С. 36–43.</mixed-citation>
			</ref>
			<ref id="B22">
				<label>22</label>
				<mixed-citation publication-type="confproc">Норенков И.П. Извлечение знаний из текстовых документов на основе концептно-ориентированной типизации запросов / И.П. Норенков, М.Ю. Уваров // Информационные технологии. — 2012. — № 4. — С. 14–17.</mixed-citation>
			</ref>
			<ref id="B23">
				<label>23</label>
				<mixed-citation publication-type="confproc">Brigida V. Technogenic Reservoirs Resources of Mine Methane When Implementing the Circular Waste Management Concept / V. Brigida, V.I. Golik, E.V. Voitovich [et al.] // Resources. — 2024. — Vol. 13. — Art. 33. — DOI: 10.3390/resources13020033.</mixed-citation>
			</ref>
			<ref id="B24">
				<label>24</label>
				<mixed-citation publication-type="confproc">Щеглов А.Ю. Механизм переадресации запросов к файловым объектам / А.Ю. Щеглов, К.А. Щеглов // Вопросы защиты информации. — 2004. — № 2 (65). — С. 41–43.</mixed-citation>
			</ref>
			<ref id="B25">
				<label>25</label>
				<mixed-citation publication-type="confproc">Райхлин В.А. Конструктивное моделирование систем информатики / В.А. Райхлин, И.С. Вершинин, Р.Ш. Минязев [и др.]; под ред. В.А. Райхлина. — Казань: Фэн, 2016. — 312 с.</mixed-citation>
			</ref>
		</ref-list>
	</back>
	<fundings/>
</article>