.. _spec_selection_data_storage: Хранение данных ==================== Для обеспечения баланса производительности и использования ресурсов сервера, выборка поддерживает несколько режимов хранения данных. От режима хранения данных зависят: - Объём используемой оперативной памяти. - Время доступа к данным. - Доступная функциональность элементов графического интерфейса. .. tip:: При выборе режимов хранения данных выборки в памяти (оперативной и/или на диске) сервера учитывайте: - число записей. - число колонок (в т.ч. не видимых). - типы данных колонок (строки занимают много больше места, чем числа или даты). .. attention:: Количества строк, указанные в под разделах текущей статьи, приведены для тестовых выборок, содержащих 12 колонок с различными типами данных. .. _spec_selection_standardcapacity: Режим стандартной ёмкости -------------------------------------------------------- Предполагает хранение всех данных выборки в оперативной памяти. Используется по умолчанию. .. note:: Количество записей ограничивается доступным объёмом :term:`Heap` и/или :xsd:class:`квотами рабочего сеанса `. **Ключевые характеристики** - Сервисные и пользовательские данные строк выборки хранятся в оперативной памяти сервера. - При расчёте числа используемых :term:`ячеек памяти ` учитываются сервисные и пользовательские данные. - Данные выборки могут быть отображены во :term:`фрейме <Фрейм>` любого типа. .. _spec_selection_highcapacity: Режим высокой ёмкости -------------------------------------------------------- :term:`Режим высокой емкости` специфицирует загрузку выборкой до 2 000 000 записей, уменьшая нагрузку на :term:`Heap` и :term:`Сборщик мусора`. .. attention:: Режим высокой емкости задействуется выборкой **только** при :ref:`полной загрузке данных `, если свойству :xsd:attr:`View.Representation.highCapacityEnabled` установлено значение ``true``. Данное условие добавлено для ограничения числа одновременно используемых файлов. Возможны несколько сценариев использования оперативной памяти сервера: - :ref:`Гибридный ` - :ref:`Фиксированный `. .. seealso:: - Свойства метаданных выборки :xsd:attr:`View.Representation.highCapacityEnabled`, :xsd:attr:`View.Representation.partitionMode`. - Свойство выборки :java:meth:`CoreSelection.isHighCapacityEnabled()`. .. _spec_selection_highcapacity_hybrid: Гибридный режим использования кучи ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Гибридный режим значительно уменьшает объем оперативной памяти, используемой для хранения пользовательских и служебных данных строк (до 90% от :ref:`стандартного режима `). .. note:: Количество записей ограничивается доступным объёмом :term:`Heap` и/или :xsd:class:`квотами рабочего сеанса `. Тестировалась загрузка до 300 000 записей. При большем количестве записей, сортировка и фильтрация данных в списках могут занимать значительное время, не комфортное для пользователей. **Ключевые характеристики** - Пользовательские данные строк выборки хранятся во временном файле на диске. В оперативной памяти сервера расположен кеш размером 5 Мб. - Сервисные данные срок выборки хранятся в оперативной памяти сервера. - При расчёте числа используемых :term:`ячеек памяти ` учитываются сервисные данные и пользовательские данные, размещённые в кэше. - Данные выборки могут быть отображены во :term:`фрейме <Фрейм>` любого типа. **Детали реализации** - Хранилищем всех данных записей выборки является временный файл на диске. - Для каждого экземпляра выборки создается отдельный временный файл хранилища. - Файлы создаются в каталоге :xsd:elem:`Configuration.HighCapacityMode.cacheDir`, в подкаталоге с именем `rows-cache-[хеш от $G3_HOME]`. - Файл хранилища создается и открывается при полной загрузке данных выборки. Закрывается и удаляется при удалении объекта выборки. - В памяти процесса расположены объекты строк, хранящие служебные данные. Каждая строка имеет уникальный ключ, формируемый в момент добавления строки в файловое хранилище. По данному ключу происходит получение данных строки из хранилища. Обращение к данным записи приводит к поиску объекта записи в хранилище. - Способ хранения данных в хранилище определяется свойством :xsd:attr:`View.Representation.HighCapacity.dataOrientation`. - Объем данных, содержащихся в кеше хранилища, составляет 5 МБ. - Подсчет :java:ref:`CoreGridView.summary() итогов` выполняется при открытии выборки. Изменение данных в выборке приводит к пересчету итогов. **Ограничения** - Временно не поддерживаются: 1. :java:ref:`CoreSelection.isMultiSelect() мультивыделение строк` .. seealso:: :ref:`Спецификация выделения нескольких записей ` 2. :java:ref:`CoreSelection.isMultiCellSelect() мультивыделение ячеек` .. seealso:: :ref:`Спецификация выделения нескольких ячеек записи ` .. _spec_selection_highcapacity_fixed: Фиксированный режим использования кучи ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Фиксированный режим минимизирует объем оперативной памяти, используемой для хранения пользовательских и служебных данных строк, до размера кэша данных, размещённого в :term:`Heap`. .. note:: Тестировалась загрузка до 2 000 000 записей. **Ключевые характеристики** - Сервисные и пользовательские данные строк выборки хранятся во временном файле на диске.В оперативной памяти сервера расположен кеш размером 5 Мб. - При расчёте числа используемых :term:`ячеек памяти ` учитываются сервисные и пользовательские данные, размещённые в кэше. - Режим применим только для :xsd:elem:`View.Representation.Layout.Frame.Grid` фрейма. **Детали реализации** 1. Основным хранилищем записей выборки является временный файл на диске. Файловое хранилище содержит все загруженные записи. #. В памяти процесса расположен кеш. Обращение к не текущей записи приводит к поиску объекта записи сначала в кеше первого уровня, а при его отсутствии — в основном хранилище. Объем данных, содержащихся в кеше, составляет 5 МБ. #. Под каждый экземпляр выборки создается отдельный временный файл хранилища. #. Файлы создаются в директории :xsd:elem:`Configuration.HighCapacityMode.cacheDir` в подкаталоге с именем ``rows-cache-[хеш от $G3_HOME]``. #. Файл кеша создается и открывается при создании выборки; закрывается и удаляется при удалении объекта выборки. **Ограничения** 1. Некоторые действия требуют пересчета индексов файлового кеша, что по времени может занимать до ``1/3`` от времени загрузки записей из БД. #. Режим применим только для :xsd:elem:`View.Representation.Layout.Frame.Grid` grid-фрейма. **Не поддерживаются** 1. Клиентская сортировка (доступна только серверная сортировка) 2. :java:ref:`CoreGridView.grouping() группировка` 3. :java:ref:`CoreSelection.isMultiSelect() мультивыделение строк` .. seealso:: :ref:`Спецификация выделения нескольких записей ` 4. :java:ref:`CoreSelection.isMultiCellSelect() мультивыделение ячеек` .. seealso:: :ref:`Спецификация выделения нескольких ячеек записи ` #. Подсчет :java:ref:`CoreGridView.summary() итогов` выполняется при открытии выборки. Изменение данных в выборке приводит к пересчету итогов. #. Особенность клиентской фильтрации: в окне автофильтра будет отображено только значение колонки для текущей строки; для ввода выражения необходимо перейти в пункт "по выбору" #. Режим высокой емкости задействуется только при :xsd:elem:`View.Representation.PartitionModes.notPartitioned` — режиме полной загрузки данных выборки. #. Особое поведение метода :java:ref:`CoreSelection.mergeItems(DataStorePacketSource)` — вставка новых записей методом mergeItems производится в конец списка. #. Отмена редактирования методом :java:ref:`CoreSelection.cancel()` приводит к полному перезапросу всех записей. #. Навигация через :java:meth:`CoreSelection.recNum\_$eq(int)`, :java:ref:`CoreSelection.prior()` и :java:ref:`CoreSelection.next()` выполняется относительно быстро и за O(1). Навигация через :java:ref:`CoreSelection.locate(Map, List)` медленная, даже по ключевому полю, так как выполняется перебором записей. .. seealso:: - :ref:`Спецификация списочного фрейма `. .. _spec_selection_ui_row_and_cell_counts: Расчёт числа загруженных строк и ячеек данных -------------------------------------------------------- При загрузке данных из БД, для соблюдения лимитов ресурсов сервера, используемых рабочим сеансом, производится подсчёт загруженных :term:`строк ` и используемых :term:`ячеек данных `. Алгоритмы подсчёта строк и ячеек зависят от режима хранения данных выборкой. **Стандартный режим** ``UIRows`` = число загруженных из БД строк (+/- вставленные/удалённые при работе). ``UICells`` = ``UIRows * ({число сервисных ячеек} + {число колонок данных})`` **Hybrid режим высокой ёмкости** ``UIRows`` = число загруженных из :term:`БД` строк (+/- вставленные/удалённые при работе). ``UICells`` = ``UIRows * {число сервисных ячеек} + {число ячеек данных в кэше}`` **Fixed режим высокой ёмкости** ``UIRows`` = число загруженных из :term:`БД` строк (+/- вставленные/удалённые при работе). ``UICells`` = ``{число ячеек данных в кэше в Fixed} + ({число ячеек данных в кэше в Fixed} + {число колонок данных}) * {количество вставленных записей}`` .. note:: ``{число сервисных ячеек}`` = ``3``. Значение ``3`` принято из примерного расчёта, учитывающего размер объекта строки выборки и сервисных данных, являющихся ссылками на объекты или целыми числами. ``{число ячеек данных в кэше в Fixed}`` = ``2`` Количество сервисных ячеек в фиксированном режиме меньше, чем в гибридном и стандартном. ``{число ячеек данных в кэше}`` = `{размер кэша в Мб} * 21000`. Значение ``21000`` принято из примерного расчёта 50 байт/ячейка. ``{количество вставленных записей}`` = коррелирует, но не точно соответствует количеству вставленных записей после открытия выборки. При вставке с активированным клиентским фильтром в некоторых ситуациях может происходить дублированное хранение вставленных записей в памяти, а в других — однократное. После применения фильтра все записи, вставленные до его использования, выбрасываются из :term:`Heap` и больше не учитываются в общем количестве вставленных записей. .. seealso:: - :ref:`spec_selection_highcapacity` - :xsd:class:`Конфигурирование квот рабочего сеанса `