Производительность и масштабируемость

В процессе выполнения задания PolyAnalyst сначала создает новую пустую таблицу с колонками, которые он должен выдать, определяет имена колонок и тип данных в них. Это осуществляется путем записывания определенной информации в файл на жестком диске компьютера, на котором установлен сервер PolyAnalyst. Эта новая таблица будет содержать выходные данные; информация, полученная в ходе обработки данных, будет записываться именно в эту таблицу. Узел Агрегирование не видоизменяет и не перемещает данные, полученные в результате работы предыдущего узла. Он лишь использует эти данные и создает совершенно новую таблицу.

Если во время создания таблицы на выходе по какой-то причине появятся две колонки с одним именем, это будет противоречить правилу уникальности имени колонки. PolyAnalyst автоматически переименует одну из колонок, чтобы решить данное противоречие. Автоматическое переименование осуществляется путем добавления цифры (1 или далее — по мере необходимости) в постпозиции к имени. Однако следует избегать автоматического переименования, поскольку результаты могут оказаться непредсказуемыми. Сложно будет определить, какая колонка была переименована, поскольку две колонки с одинаковым именем могут содержать совершенно разные значения. Сам факт автоматической номинации не отражается на скрипте или в настройке узла, что также может вызвать затруднения. Итак, не следует допускать, чтобы PolyAnalyst автоматически переименовывал колонки. Один из возможных вариантов в данном случае — использование узла Модификация колонок перед агрегированием для их переименования (обычно это колонки, входящие в состав ключа агрегирования). Другой способ — тщательно продумать имя новой колонки, если подключена опция Добавить колонку с количеством строк.

Как только структура таблицы создана, PolyAnalyst обращается к входным данным в буферах. Далее, каждая запись сначала проверяется на предмет соответствия любому ключу. Если запись соответствует ключу агрегирования, она включается в выходную таблицу, и значения выходных записей корректируются. Если запись ключу не соответствует, эта запись без изменений будет отображена в конце таблицы. Это детерминируемый процесс, поскольку количество исходных строк известно, и в списке задач появится индикатор выполнения. Каждый раз, когда PolyAnalyst обращается к новому буферу и из него считывается набор исходных строк, пересчитывается необходимый объем RAM, и индикатор выполнения обновляется.

Время обработки отдельных записей относительно постоянно, но когда вычисления подходят к концу, PolyAnalyst должен проверять уже имеющиеся в выходной таблице записи и это, соответственно, увеличит время обработки каждой исходной записи. Индикатор выполнения может замедлиться. Однако это будет ощутимо только при работе с большими таблицами.

Узел Агрегирование способен обрабатывать большое количество записей и колонок.

Более крупные ключи агрегирования увеличат время выполнения узла. Каждая дополнительная колонка в составе ключа продлевает операцию сравнения по ключу, которая выполняется несколько раз, что ведет к экспоненциальному увеличению времени выполнения узла. Сравнение с заданным ключом агрегирования происходит в виртуальной памяти сервера PolyAnalyst. При создании ключа агрегирования необходимо учитывать объем доступной узлу памяти. Сравнение по строковым ключам проходит дольше, чем по числовым, поскольку операция поиска индекса выполняется для каждого строкового значения. Любые непроиндексированные колонки ключа сначала пройдут индексацию. При работе с миллионами записей на индексацию строк может уйти очень много времени. Сравнение одной записи с другой будет проходить быстрее и эффективнее, а также задействовать меньшую память, если ключ будет содержать меньшее количество колонок. Потребуется также меньше оперативной памяти, если ключ содержит колонки с такими значениями, для которых операция проверки на равенство выполняется быстро. Например, компьютер может очень быстро проверить два числа на равенство (или его отсутствие). Сравнение категориальных или строковых значений требует значительно больше времени. PolyAnalyst использует категориальные индексы для отдельных строковых значений, назначая для них уникальные ID, для того, чтобы ускорить сравнение. И все-таки операция сравнения предполагает запрос индекса категориальной колонки, что вызывает задержку (пусть в наносекундах) в работе узла, которая становится ощутимой при работе с миллионными корпусами записей. Из сказанного следует помнить о том, что для настройку ключа агрегирования целесообразно выбирать одно или несколько цифровых полей. Созданию ключа агрегирования следует уделять особое внимание, поскольку это позволит значительно повысить производительность узла. При использовании узла Файлы CSV помните, что для того, чтобы узел Агрегирование работал эффективнее, в исходном файле должны присутствовать колонки с числовыми или целочисленными данными. Можно также разбить строки на цифры путем использования узлов Производные колонки или Модификация колонок, чтобы преобразовать данные в такой формат, который легче поддается агрегированию.

Все способы агрегирования предназначены для последовательной работы с буферизованными наборами записей и постепенного приращения пограничных значений. Узел Агрегирование не загружает в память всю таблицу целиком. Он сначала заканчивает работу над одним буфером, затем приступает к другому. Каждый буфер подвергается агрегированию индивидуально, затем результаты "сливаются" в выходную таблицу. Это позволяет сократить объем используемой памяти. Некоторые способы агрегирования (например, конкатенация), требуют больше времени. Агрегирование чисел и булевских колонок завершается быстро и не требует много памяти.

Выходная таблица будет совершенно новой, похожей на таблицы, которые создаются при загрузке данных. Она отличается от многих других производных таблиц, которые повторно используют выделенный объем памяти. Для сохранения данных, полученных в результате работы узла Агрегирование, потребуется дополнительное пространство диска, что увеличит размер проекта. Для того, чтобы узел был выполнен, пользователю следует убедиться в том, что на диске достаточно места для временных файлов, используемых во время обработки, и для хранения файла с новой таблицей.

Максимальное количество колонок для ключа агрегирования теоретически не ограничено. На практике же, при среднем объеме доступной виртуальной памяти, и средней скорости процессора, рекомендуется использовать не более 10 колонок в ключе. Это ограничение связано, главным образом, с распределением доступной памяти, которая при настройке по умолчанию составляет 100 мегабайт на узел. Можно выделить два этапа в работе узла Агрегирование: индексация и обработка данных. На этапе индексации 100 % памяти используется для загрузки ключа агрегирования. На этапе обработки входные данные занимают около 3/4 доступной памяти. Чем больше колонок указано в ключе, тем меньше памяти приходится на каждый отдельную колонку. На операции считывания и записи на этапе сохранения и обработки информации уходит большее количество времени. Между количеством колонок в ключе и скоростью работы узла существует линейная зависимость.

Такие способы агрегирования, как количество уникальных значений, медиана и мода, частично сортируют входные данные при обработке, что значительно увеличивает время обработки (как если бы колонки, подвергаемые агрегированию, были в составе ключа). Конкатенация текстовых значений — самая длительная операция, которая, к тому же, требует наличия наибольшего объема памяти из-за сложных операций ввода и вывода, необходимых при работе с текстовыми данными.

Общий объем виртуальной памяти, необходимый для работы узла Агрегирование на этапе индексации, определяется следующим образом:

Количество ключей агрегирования * (Количество агрегируемых колонок, требующих сортировки + 1) * 8 * Размер буфера, необходимый для обработки одной строки.

На этапе обработки:

8 * (Количество ключей агрегирования * (Количество агрегируемых колонок, требующих сортировки + 1) + Количество агрегируемых колонок, не требующих сортировки + Количество записей) * Размер буфера, необходимый для обработки одной строки.

Размер буфера высчитывается автоматически в зависимости от максимального объема памяти, выделенной для работы узла.

Ограничения по количеству исходных строк и колонок данных: узел Агрегирование может обработать неограниченное количество исходных колонок, и это не повлияет на время обработки. Количество же строк ограничивается в зависимости от объема данных, который PolyAnalyst может сохранить.