Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539
отправлено / posted
Для заполнения таблицы я вызываю пользовательскую функцию несколько раз: функция возвращает массив, и каждый столбец заполняется массивом со своим индексом. Отработка функции занимает довольно существенное время, поэтому сразу заметно, что каждый раз она считается заново (вызвал 3 раза - отчёт формируется в 3 раза дольше). Поскольку функция вызывается без аргументов, я считал, что она будет посчитана 1 раз, а во всех остальных вызовах в шаблоне будет подставлен уже подсчитанный результат. Это не так?
Сообщения / Posts 49 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539
отправлено / posted
Данные берутся из каналов функцией READVAL за определённый промежуток времени. Сейчас вот так: READVAL(kanal[i], TIME()-10, TIME() );
отправлено / posted
Это действительно так. Он при каждом вызове обращается к МРВ за архивными значениями. При этом буферизация выборки из СПАД производится самим МРВ, поэтому необходимо обратить внимание на сколько возрастает основная и виртуальная память процессе Drawserv.exe в момент формирования отчета. Если они перекрывают в общем объем доступной физической памяти, то начинается торможение, потому как в дело подключается виртуальная память на жестком диске...
Сообщения / Posts 17335 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539
отправлено / posted
Таким образом, если у меня в таблице 4 столбца и 300 строк, то функция будет вызвана 4х300 = 1200 раз. Вот из-за этого-то, наверное, и возникает торможение, а не из-за переполнения памяти. Если функция будет считаться секунду, на заполнение таблицы уйдёт 20 мин (проверка подтвердила - всё так). Это не может не "радовать"... Ладно, тогда подскажите, как можно соорудить следующую таблицу: одна колонка - время изменения канала, вторая - комментарий, соответствующий значению канала в этот момент (в сущности - значение канала), третья - наименование устройства, соответствующее имени канала. Строки должны быть отсортированы по времени изменения. Сейчас я сделал так. В функции формируется массив ссылок на каналы, затем формируется массив, элементами которого являются массивы, сформированные функцией READVAL (канал, время от, время до) для каналов из первого массива. Затем для этих значений формируются массивы времени изменения посредством функции TIME(Архивное значение), и массивы ссылок на каналы. Затем всё это заносится в три итоговых массива: один содержит времена и даты, второй – соответствующие им значения каналов, третий соответствующие им ссылки на каналы. Затем я сортирую эти массивы по времени. И в конце делаю все три массива элементами выходного массива. Таким образом, этот массив содержит все необходимые данные для построения нужной таблицы. Жаль, что для каждой ячейки он рассчитывается заново…
Кстати, виртуальная память DrawServ'а в процессе формирования отчёта не изменяется, а используемая процессом память возрастает незначительно.
Нельзя ли как-нибудь "обмануть" сервер документирования, чтобы он не пересчитывал функцию для каждой ячейки? Например, передать значения каналов этой функции в качестве аргумента?
Сообщения / Posts 49 | Из / From: Россия
| IP / IP: IP адрес / IP address |
Михаил_Тапилин
Forum Member / Участник форума
Участник № / Member № 1539