4.7. Хранение данных#
Для обеспечения баланса производительности и использования ресурсов сервера, выборка поддерживает несколько режимов хранения данных. От режима хранения данных зависят:
Объём используемой оперативной памяти.
Время доступа к данным.
Доступная функциональность элементов графического интерфейса.
Tip
При выборе режимов хранения данных выборки в памяти (оперативной и/или на диске) сервера учитывайте:
число записей.
число колонок (в т.ч. не видимых).
типы данных колонок (строки занимают много больше места, чем числа или даты).
Attention
Количества строк, указанные в под разделах текущей статьи, приведены для тестовых выборок, содержащих 12 колонок с различными типами данных.
4.7.1. Режим стандартной ёмкости#
Предполагает хранение всех данных выборки в оперативной памяти. Используется по умолчанию.
Note
Количество записей ограничивается доступным объёмом Heap
и/или квотами рабочего сеанса
.
Ключевые характеристики
Сервисные и пользовательские данные строк выборки хранятся в оперативной памяти сервера.
При расчёте числа используемых ячеек памяти учитываются сервисные и пользовательские данные.
Данные выборки могут быть отображены во фрейме любого типа.
4.7.2. Режим высокой ёмкости#
Режим высокой емкости специфицирует загрузку выборкой до 2 000 000 записей, уменьшая нагрузку на Heap и Сборщик мусора.
Attention
Режим высокой емкости задействуется выборкой только при полной загрузке данных, если свойству
View.Representation.highCapacityEnabled
установлено значение true
. Данное условие добавлено для
ограничения числа одновременно используемых файлов.
Возможны несколько сценариев использования оперативной памяти сервера:
See also
Свойства метаданных выборки
View.Representation.highCapacityEnabled
,View.Representation.partitionMode
.Свойство выборки
CoreSelection.isHighCapacityEnabled()
.
4.7.2.1. Гибридный режим использования кучи#
Гибридный режим значительно уменьшает объем оперативной памяти, используемой для хранения пользовательских и служебных данных строк (до 90% от стандартного режима).
Note
Количество записей ограничивается доступным объёмом Heap и/или квотами рабочего сеанса
.
Тестировалась загрузка до 300 000 записей. При большем количестве записей, сортировка и фильтрация данных в списках
могут занимать значительное время, не комфортное для пользователей.
Ключевые характеристики
Пользовательские данные строк выборки хранятся во временном файле на диске. В оперативной памяти сервера расположен кеш размером 5 Мб.
Сервисные данные срок выборки хранятся в оперативной памяти сервера.
При расчёте числа используемых ячеек памяти учитываются сервисные данные и пользовательские данные, размещённые в кэше.
Данные выборки могут быть отображены во фрейме любого типа.
Детали реализации
Хранилищем всех данных записей выборки является временный файл на диске.
Для каждого экземпляра выборки создается отдельный временный файл хранилища.
Файлы создаются в каталоге
Configuration.HighCapacityMode.cacheDir
, в подкаталоге с именем rows-cache-[хеш от $G3_HOME].Файл хранилища создается и открывается при полной загрузке данных выборки. Закрывается и удаляется при удалении объекта выборки.
В памяти процесса расположены объекты строк, хранящие служебные данные. Каждая строка имеет уникальный ключ, формируемый в момент добавления строки в файловое хранилище. По данному ключу происходит получение данных строки из хранилища. Обращение к данным записи приводит к поиску объекта записи в хранилище.
Способ хранения данных в хранилище определяется свойством
View.Representation.HighCapacity.dataOrientation
.Объем данных, содержащихся в кеше хранилища, составляет 5 МБ.
Подсчет
CoreGridView.summary() итогов
выполняется при открытии выборки. Изменение данных в выборке приводит к пересчету итогов.
Ограничения
Временно не поддерживаются:
4.7.2.2. Фиксированный режим использования кучи#
Фиксированный режим минимизирует объем оперативной памяти, используемой для хранения пользовательских и служебных данных строк, до размера кэша данных, размещённого в Heap.
Note
Тестировалась загрузка до 2 000 000 записей.
Ключевые характеристики
Сервисные и пользовательские данные строк выборки хранятся во временном файле на диске.В оперативной памяти сервера расположен кеш размером 5 Мб.
При расчёте числа используемых ячеек памяти учитываются сервисные и пользовательские данные, размещённые в кэше.
Режим применим только для
View.Representation.Layout.Frame.Grid
фрейма.
Детали реализации
Основным хранилищем записей выборки является временный файл на диске. Файловое хранилище содержит все загруженные записи.
В памяти процесса расположен кеш. Обращение к не текущей записи приводит к поиску объекта записи сначала в кеше первого уровня, а при его отсутствии — в основном хранилище. Объем данных, содержащихся в кеше, составляет 5 МБ.
Под каждый экземпляр выборки создается отдельный временный файл хранилища.
Файлы создаются в директории
Configuration.HighCapacityMode.cacheDir
в подкаталоге с именемrows-cache-[хеш от $G3_HOME]
.Файл кеша создается и открывается при создании выборки; закрывается и удаляется при удалении объекта выборки.
Ограничения
Некоторые действия требуют пересчета индексов файлового кеша, что по времени может занимать до
1/3
от времени загрузки записей из БД.Режим применим только для
View.Representation.Layout.Frame.Grid
grid-фрейма.Не поддерживаются
Клиентская сортировка (доступна только серверная сортировка)
Подсчет
CoreGridView.summary() итогов
выполняется при открытии выборки. Изменение данных в выборке приводит к пересчету итогов.Особенность клиентской фильтрации: в окне автофильтра будет отображено только значение колонки для текущей строки; для ввода выражения необходимо перейти в пункт “по выбору”
Режим высокой емкости задействуется только при
View.Representation.PartitionModes.notPartitioned
— режиме полной загрузки данных выборки.Особое поведение метода
CoreSelection.mergeItems(DataStorePacketSource)
— вставка новых записей методом mergeItems производится в конец списка.Отмена редактирования методом
CoreSelection.cancel()
приводит к полному перезапросу всех записей.Навигация через
CoreSelection.recNum_$eq(int)
,CoreSelection.prior()
иCoreSelection.next()
выполняется относительно быстро и за O(1). Навигация черезCoreSelection.locate(Map, List)
медленная, даже по ключевому полю, так как выполняется перебором записей.
See also
4.7.3. Расчёт числа загруженных строк и ячеек данных#
При загрузке данных из БД, для соблюдения лимитов ресурсов сервера, используемых рабочим сеансом, производится подсчёт загруженных строк и используемых ячеек данных. Алгоритмы подсчёта строк и ячеек зависят от режима хранения данных выборкой.
Стандартный режим
UIRows
= число загруженных из БД строк (+/- вставленные/удалённые при работе).
UICells
= UIRows * ({число сервисных ячеек} + {число колонок данных})
Hybrid режим высокой ёмкости
UIRows
= число загруженных из ДБ строк (+/- вставленные/удалённые при работе).
UICells
= UIRows * {число сервисных ячеек} + {число ячеек данных в кэше}
Fixed режим высокой ёмкости
UIRows
= число загруженных из ДБ строк (+/- вставленные/удалённые при работе).
UICells
= {число ячеек данных в кэше в Fixed} + ({число ячеек данных в кэше в Fixed} + {число колонок данных}) * {количество вставленных записей}
Note
{число сервисных ячеек}
= 3
.
Значение 3
принято из примерного расчёта, учитывающего размер объекта строки выборки и сервисных данных, являющихся ссылками
на объекты или целыми числами.
{число ячеек данных в кэше в Fixed}
= 2
Количество сервисных ячеек в фиксированном режиме меньше, чем в гибридном и стандартном.
{число ячеек данных в кэше}
= {размер кэша в Мб} * 21000.
Значение 21000
принято из примерного расчёта 50 байт/ячейка.
{количество вставленных записей}
= коррелирует, но не точно соответствует количеству вставленных записей после открытия выборки.
При вставке с активированным клиентским фильтром в некоторых ситуациях может происходить дублированное хранение вставленных записей в памяти, а в других — однократное.
После применения фильтра все записи, вставленные до его использования, выбрасываются из Heap и больше не учитываются в общем количестве вставленных записей.