cro-logo      
Добро пожаловать, Гость. Пожалуйста, выберите Вход

 
 
  ГлавнаяСправкаПоискВход  
 
Страниц: 1 2 3 
Послать Тему Печать
Заполнение списка и словарные поля (Прочитано 4 087 раз)
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #15 - 17.01.2022 :: 17:36:55
 
Для начала проведите ревизию и оптимизацию основного банка и словарного. Затем в этих банках постройте индексы по всем индексным полям. Особенно, по полям код и понятие в словарях. Затем снова попробуйте на скорость.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #16 - 17.01.2022 :: 18:15:24
 
спасибо!

скорость вывода возросла

А можно у словарных полей получать код, но без обращения к самой словарной базе? Я бы программно заполнял поле текстом, создав таблицу в памяти, а не выполнять чтение словаря для каждого значения
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #17 - 17.01.2022 :: 18:38:52
 
Можно и так сделать.
Словарь это точно такой же банк данных, как и основной. Работать с ним можно точно так же. Можно загрузить в память все словари, если они не огромных размеров. Только сомнительно, что это даст большой выигрыш. Дело в том, что обращение к словарю и получение понятия это обычный запрос, который выполняется очень быстро. Можете проверить.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #18 - 17.01.2022 :: 18:39:27
 
вот у Record есть два метода: GetValuesCount и GetFieldsValuesCount

а можно как-то получить сами эти значения, без декодирования значений?

словари смешные, под сотню значений
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #19 - 17.01.2022 :: 18:57:05
 
Ну, так Вы эти значения и получаете.
GetValue(6, 0, true, 1) -- это декодированные.
GetValue(6, 0, false) -- это не декодированные.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #20 - 18.01.2022 :: 17:00:19
 
на данный момент пришел к такому решению:

при старте начальной формы загружаю значения словаря в таблицу, пока форму пользователь не закрыл они будут в памяти, не нужно каждый раз читать с диска
Цитата:
Form_Load(form)
     base = CroApp:GetBank():GetBase(1)
     voc = CroApp:GetBank():GetVocabulary()
     voc_1 = voc:GetBase(1):GetRecordSet()
     voc_2 = voc:GetBase(2):GetRecordSet()
end


после этого словари перевожу в табличный вид, где ключ это будет код словаря, чтобы потом было проще сопоставление делать
Цитата:
tbl = {}
for record in voc.Records do
   code = record:GetValue(1)
   concept = record:GetValue(2)
   tbl [code]=concept
end
return tbl


далее выполняю запрос по образцу и результат запроса + словари передаю в форму отображения результатов
Цитата:
formArg = {}
formArg.list = records
formArg.voc_1 = tbl_voc_1
formArg.voc_2 = tbl_voc_2
CroApp.GetBank(): OpenForm(2,0,Me,formArg)


в форме вывода результата  создаю этот сам список
Цитата:
ArgRec = Arg.list
ArgVoc_1 = Arg.voc_1
ArgVoc_2 = Arg.voc_2

for record in ArgRec.Records do
    local str1 = FncReturnStr(record:GetValue(1,0,false), ArgVoc_1, 40)
    local str2 = FncReturnStr(record:GetValue(2,0,false), ArgVoc_2, 40)
    local str3 = record:GetValue(3):lr(40)
    Me.list1:Add(str1.." "..str2.." "..str3
end

FncReturnStr(tbl, voc, num)
   local str=""
   for _, I in pairs(tbl) do
      str = str..voc[I].."; "
   end
   return string.lr(str, num)
end


такая реализация позволила создать список на 14к записей на машине пользователя в сети за 38.320 мс
возможно в тот момент число пользователей было не сильно много, не большая нагрузка на Кронос была, но скорость значительно возросла по сравнению со вчерашним днём

Большое спасибо за подсказки.

Как я понимаю если делать отображение результатов по стандартной форме, то замедления нет. Авторы системы используют какие-то свои механизмы создания таблицы просмотра со словарными полями (возможно они используют динамическую загрузку данных только для тех строк, что в данный момент видны на экране), а вот если использовать самописные формы вывода результатов - тут нужно искать решения и что-то придумывать (это актуально для версии 6, для версии 7 вроде как сделали нужный контрол)
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #21 - 18.01.2022 :: 17:43:20
 
Цитата:
38.320
Это в секундах и 10-ти тысячных долях или в миллисекундах?
Если 38 секунд для 14 к записей, то это много. Такие вопросы быстродействия здесь на форуме поднимались. Были найдены более оптимальные решения.
Цитата:
список на 14к записей
- это записей банка с декодированными словарными полями или список значений словаря?
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #22 - 18.01.2022 :: 18:06:41
 
да, это в секундах
Я читал про "производительность" и по вашим ссылка в теме и по общему поиску, но там решения были на уровне "железной" части
"Программных" способов речения проблемы я не увидел, кроме настройки ОС

14к это ответ на запрос (число записей), в котором 10 полей и несколько из них словарных, которые я декодирую программно, а не средствами Кронос ( GetValue(2, 0, true, 1)  )
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #23 - 18.01.2022 :: 18:23:04
 
Цитата:
...
Я читал про "производительность" и по вашим ссылка в теме и по общему поиску, но там решения были на уровне "железной" части
"Программных" способов речения проблемы я не увидел, кроме настройки ОС...

Это совершенно разные вещи. Одно дело ускорение работы системы (Cronos.exe)
и другое оптимизация скорости работы программного кода форм.
Вот одно из последних обсуждений оптимизации скорости.
Провел испытания заполнения списка всем содержанием базы КЛАДР (перебором RecordSet) более 220 тысяч строк. Результат - 5 секунд. (Локальная машина - ноутбук 10 летней давности core i3, win7 64, 8 Гб)
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #24 - 18.01.2022 :: 18:39:51
 
Zuluss писал(а) 18.01.2022 :: 18:23:04:
[quote]...
Локальная машина - ноутбук 10 летней давности core i3, win7 64, 8 Гб


здесь ключевое слово - локальная машина

я пока формы делал даже не задумывался о скорости работы, всё было просто на "Ура"
но как только свою форму запустил на машине пользователя, то был не приятно удивлён временем выполнения
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #25 - 18.01.2022 :: 18:50:29
 
Цитата:
как только свою форму запустил на машине пользователя, то был не приятно удивлён временем выполнения

Это не проблемы формы или Cronos-а. Это проблемы сети, и даже не сервера. Это может быть и одноранговая сеть вообще без сервера.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #26 - 18.01.2022 :: 19:02:59
 
чуть отойдя от основной темы:

вариантов запуска на ПК пользователей два

- ссылка ярлыка на "расшаренную" папку с установленным Кронос на условном сервере
- запуск терминалов удаленного рабочего стола на ПК пользователей и в этом терминале запуск Кронос

правильно я понимаю?
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #27 - 18.01.2022 :: 21:16:07
 
По крайней мере это самые распространенные варианты и активно используются. Ничто не мешает использовать их одновременно. Заодно можно сравнить скорость работы одинаковых задач.
Наверх
 
 
IP записан
 
Юзер99335588
Опытный пользователь
***
Вне Форума



Сообщений: 92
Re: Заполнение списка и словарные поля
Ответ #28 - 19.01.2022 :: 10:08:33
 
Спасибо большое!

Сдаётся мне, из того, что я на форуме читал, по скорости будет лучшим вариант с удалённым рабочим столом. Потому что не будет передачи массивов по сети, только данные необходимые для отображения самого рабочего стола.

Если получится, я попробую создать сессию и проверить этот вариант
Наверх
 
 
IP записан
 
Zuluss
Бета-тестер
Вне Форума


Старинный пользователь
Кронос

Сообщений: 3 033
Санкт-Петербург
Re: Заполнение списка и словарные поля
Ответ #29 - 19.01.2022 :: 11:58:11
 
Цитата:
... по скорости будет лучшим вариант с удалённым рабочим столом. Потому что не будет передачи массивов по сети, только данные необходимые для отображения самого рабочего стола...

Это может быть обманчивым мнением. Например, для передачи картинки одного кадра рабочего стола со средним разрешением (1280х1024х24 бит) требуется передать около 4 Мб. Для плавности отображения требуется частота обновления не менее 16 кадров в секунду. Т.е. суммарный объем для одного рабочего стола 64 мегабайта в секунду. Т.о. пропускная способность сети должна быть не менее 512 мбит/сек даже без учета передачи служебной информации. И это только для одного рабочего стола (УРС), если я не ошибся (запутался) где то в расчетах. Эти расчеты не учитывают адаптивные возможности УРС, т.е. отправку данных только при изменениях на экране, и сжатия данных. Это позволяет значительно снизить требования к пропускной способности. Тем не менее перемещение мыши на 1 пиксель уже является необходимостью отправки обновленного экрана.
Можно сделать вывод о том, что передача массива данных из банка данных к клиенту требует меньше сетевых ресурсов, чем при передаче экрана УРС.
Провел эксперимент с заполнением списка. В моих условиях получилось порядка 50-60 тысяч строк в секунду со средним объемом строки 64 байта. Суммарный объем примерно 3.2 Мб. Это сравнимо с передачей только одного экрана УРС. В наихудшем случае для отображения списка потребуется передать  50-60 тысяч экранов, в реальности происходит эффект зависания и потом предъявляется заполненный список.
Вот такая математика получилась. Если где то неверно что то трактую приму все замечания с благодарностью.
Наверх
 
 
IP записан
 
Страниц: 1 2 3 
Послать Тему Печать