4.7. Хранение данных#

Для обеспечения баланса производительности и использования ресурсов сервера, выборка поддерживает несколько режимов хранения данных. От режима хранения данных зависят:

  • Объём используемой оперативной памяти.

  • Время доступа к данным.

  • Доступная функциональность элементов графического интерфейса.

Tip

При выборе режимов хранения данных выборки в памяти (оперативной и/или на диске) сервера учитывайте:

  • число записей.

  • число колонок (в т.ч. не видимых).

  • типы данных колонок (строки занимают много больше места, чем числа или даты).

Attention

Количества строк, указанные в под разделах текущей статьи, приведены для тестовых выборок, содержащих 12 колонок с различными типами данных.

4.7.1. Режим стандартной ёмкости#

Предполагает хранение всех данных выборки в оперативной памяти. Используется по умолчанию.

Note

Количество записей ограничивается доступным объёмом Heap и/или квотами рабочего сеанса.

Ключевые характеристики

  • Сервисные и пользовательские данные строк выборки хранятся в оперативной памяти сервера.

  • При расчёте числа используемых ячеек памяти учитываются сервисные и пользовательские данные.

  • Данные выборки могут быть отображены во фрейме любого типа.

4.7.2. Режим высокой ёмкости#

Режим высокой емкости специфицирует загрузку выборкой до 2 000 000 записей, уменьшая нагрузку на Heap и Сборщик мусора.

Attention

Режим высокой емкости задействуется выборкой только при полной загрузке данных, если свойству View.Representation.highCapacityEnabled установлено значение true. Данное условие добавлено для ограничения числа одновременно используемых файлов.

Возможны несколько сценариев использования оперативной памяти сервера:

See also

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 фрейма.

Детали реализации

  1. Основным хранилищем записей выборки является временный файл на диске. Файловое хранилище содержит все загруженные записи.

  2. В памяти процесса расположен кеш. Обращение к не текущей записи приводит к поиску объекта записи сначала в кеше первого уровня, а при его отсутствии — в основном хранилище. Объем данных, содержащихся в кеше, составляет 5 МБ.

  3. Под каждый экземпляр выборки создается отдельный временный файл хранилища.

  4. Файлы создаются в директории Configuration.HighCapacityMode.cacheDir в подкаталоге с именем rows-cache-[хеш от $G3_HOME].

  5. Файл кеша создается и открывается при создании выборки; закрывается и удаляется при удалении объекта выборки.

Ограничения

  1. Некоторые действия требуют пересчета индексов файлового кеша, что по времени может занимать до 1/3 от времени загрузки записей из БД.

  2. Режим применим только для View.Representation.Layout.Frame.Grid grid-фрейма.

    Не поддерживаются

    1. Клиентская сортировка (доступна только серверная сортировка)

    2. CoreGridView.grouping() группировка

    3. CoreSelection.isMultiSelect() мультивыделение строк

    4. CoreSelection.isMultiCellSelect() мультивыделение ячеек

  3. Подсчет CoreGridView.summary() итогов выполняется при открытии выборки. Изменение данных в выборке приводит к пересчету итогов.

  4. Особенность клиентской фильтрации: в окне автофильтра будет отображено только значение колонки для текущей строки; для ввода выражения необходимо перейти в пункт “по выбору”

  5. Режим высокой емкости задействуется только при View.Representation.PartitionModes.notPartitioned — режиме полной загрузки данных выборки.

  6. Особое поведение метода CoreSelection.mergeItems(DataStorePacketSource) — вставка новых записей методом mergeItems производится в конец списка.

  7. Отмена редактирования методом CoreSelection.cancel() приводит к полному перезапросу всех записей.

  8. Навигация через CoreSelection.recNum_$eq(int), CoreSelection.prior() и CoreSelection.next() выполняется относительно быстро и за O(1). Навигация через CoreSelection.locate(Map, List) медленная, даже по ключевому полю, так как выполняется перебором записей.

4.7.3. Расчёт числа загруженных строк и ячеек данных#

При загрузке данных из БД, для соблюдения лимитов ресурсов сервера, используемых рабочим сеансом, производится подсчёт загруженных строк и используемых ячеек данных. Алгоритмы подсчёта строк и ячеек зависят от режима хранения данных выборкой.

Стандартный режим

UIRows = число загруженных из БД строк (+/- вставленные/удалённые при работе).

UICells = UIRows * ({число сервисных ячеек} + {число колонок данных})

Hybrid режим высокой ёмкости

UIRows = число загруженных из ДБ строк (+/- вставленные/удалённые при работе).

UICells = UIRows * {число сервисных ячеек} + {число ячеек данных в кэше}

Fixed режим высокой ёмкости

UIRows = число загруженных из ДБ строк (+/- вставленные/удалённые при работе).

UICells = {число ячеек данных в кэше в Fixed} + ({число ячеек данных в кэше в Fixed} + {число колонок данных}) * {количество вставленных записей}

Note

{число сервисных ячеек} = 3. Значение 3 принято из примерного расчёта, учитывающего размер объекта строки выборки и сервисных данных, являющихся ссылками на объекты или целыми числами.

{число ячеек данных в кэше в Fixed} = 2 Количество сервисных ячеек в фиксированном режиме меньше, чем в гибридном и стандартном.

{число ячеек данных в кэше} = {размер кэша в Мб} * 21000. Значение 21000 принято из примерного расчёта 50 байт/ячейка.

{количество вставленных записей} = коррелирует, но не точно соответствует количеству вставленных записей после открытия выборки. При вставке с активированным клиентским фильтром в некоторых ситуациях может происходить дублированное хранение вставленных записей в памяти, а в других — однократное. После применения фильтра все записи, вставленные до его использования, выбрасываются из Heap и больше не учитываются в общем количестве вставленных записей.