Написан тулкит приема потока данных (массив амплитуд) из сети ethernet 12800 байт в секунду в самом простом случае или тоже кол-во умноженное на 3 или на 4 если в сети несколько потоков от разных приборов. При этом происходит копирование одних и тех же байт 2 раза: 1 раз - из dll в тулкит, там они накапливаются до нужного объема, 2 раз - когда накопился нужный объем данных за 1 секунду, он посылается в очередь.
На скриншоте Read.vi забирает из очереди массив байт за одну секунду. Далее уже происходит парсинг и обработка.
На обычном компьютере все работает хорошо, но на одноплатнике уже приходится заниматься оптимизацией, т.к. на пределе загрузки цп, пакеты теряются. Если я не могу избавиться от копирования байт в первом случае, то хочу хотябы избавиться от копирования во второй раз. Никогда не пользовался палитрой Memory control. Сделана ли она именно для такой задачи? Дублирования данных не будет? Еще, ни разу не пользовался опцией Channel Writer. Она тоже для таких случаев?
Прием потока данных
- Juri
- I/O
- Сообщения: 243
- Зарегистрирован: 19 апр 2017, 23:06
- Версия LabVIEW: 2021
- Благодарил (а): 11 раз
- Поблагодарили: 4 раза
Re: Прием потока данных
Второй вопрос вдогонку. В примере есть 3 участка массива байт (в disabled структуре), который можно парсить одной vi, однако это сильно ухудшает производительность. Такой эффект возникает только когда код программы загружается из lvlibp. Первый график загрузки цп - когда используется суб vi. Второй график - когда код vi был продублирован три раза без использования суб vi. Игрался разными свойствами vi в меню Execution, но ничего не помогает. Впечатление, что свойство inline не работает если код загружен из lvlibp. Это лечится?
-
- professor
- Сообщения: 3075
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 31 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Прием потока данных
Из вашей картинки всё сразу очевидно, что даже хрустальный шар не нужен.
Написан кем?
Происходит зачем? Если авт ор вы, то избавьтесь от двойного копированияПри этом происходит копирование одних и тех же байт 2 раза:
Тут первая непонятнка с методом накопления, но главный вопрос: что мешает или сразу брать больше, или не копить, а отправлять дальше?1 раз - из dll в тулкит, там они накапливаются до нужного объема, 2 раз - когда накопился нужный объем данных за 1 секунду, он посылается в очередь.
И вот это не понятно. Вы копите данные с помощью очереди?На скриншоте Read.vi забирает из очереди массив байт за одну секунду. Далее уже происходит парсинг и обработка.
Работать на пределе загрузки вообще так себе затеят.к. на пределе загрузки цп, пакеты теряются.
Это зависит от прямых рук программиста. Избежать ненужного копирования можно и без особых палитрДублирования данных не будет?
-
- professor
- Сообщения: 3075
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 31 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Прием потока данных
Если Unflatten From String вы называете парсингом, то я бы призадумался над оптимизацией самого метода.
И если это некий массив, что мешает его разом конвертировать в последовательность чего-то там?
Если нет, то воспользуйтесь хотя бы String To Byte Array для начала
-
- doctor
- Сообщения: 2127
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 21 раз
- Поблагодарили: 20 раз
Re: Прием потока данных
При такой "мощной" обработке и потоке данных возникают сильные сомнения, что проблема в парсинге и копировании данных. Используйте профилер, чтобы определить VI, которая грузит процессор. И уже с ней надо разбираться.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение