Передача данных DVR vs Queue

Общие принципы, проектирование, модуляризация, темплейты и шаблоны
Аватара пользователя
jane_wild
adviser
adviser
Сообщения: 234
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 18 раз
Поблагодарили: 2 раза

Передача данных DVR vs Queue

Сообщение jane_wild »

Всем здравствуйте. Появился новый проект, обычный сбор данных. Планируется использование, cDAQ с тремя модулями NI9205 (помимо цифровых). следовательно ai каналов будет достаточно много. А поскольку время терпит, то решила в целях самообразования, использовать что то новенькое (для меня). Выбираю способ передачи данных (2D array достаточно большого объема) между DVR и Queue. Где то читала, что физически очереди передают не сами данные, а ссылку на них, если это так, то DVR по сути та же ссылка. И снова вопрос о быстродействии - кто кого? И вообще преимущества и недостатки DVR и очередей. Ребята можете объяснить "на пальцах"
Спасибо.
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Передача данных DVR vs Queue

Сообщение ujin »

Откуда и куда данные будете передавать?
DVR подходит только для передачи данных внутри одного устройства.
Вложения
APIs for messaging.png
Communication Reference Architectures.png
Аватара пользователя
jane_wild
adviser
adviser
Сообщения: 234
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 18 раз
Поблагодарили: 2 раза

Re: Передача данных DVR vs Queue

Сообщение jane_wild »

ujin писал(а): 25 авг 2020, 15:24 Откуда и куда данные будете передавать?
DVR подходит только для передачи данных внутри одного устройства.
Я имела ввиду между отдельными VI на одной машине. Эту картинку я видела, но там ничего не сказано о производительности.
Если я правильно понимаю, то главное отличие в том, что в случае с очередями можно организовать непрерывный сбор данных, без потерь (есть буфер). Но в случае задержек с обработкой быстро поступающих и большого объема данных может возникнуть времменной лаг. С DVR лага не будет, но возможны пропуски данных. Мои рассуждения верны?
Аватара пользователя
ladik

Silver
developer
developer
Сообщения: 252
Зарегистрирован: 18 ноя 2014, 11:45
Награды: 1
Версия LabVIEW: 2015, 2019
Откуда: Астана
Поблагодарили: 2 раза

Re: Передача данных DVR vs Queue

Сообщение ladik »

Была подобная задача, только на RIO. 12 аналоговых каналов, 200 семплов/сек, срок хранения данных - в пределах нескольких минут. Методом проб и ошибок пришёл к тому, что самый удобный и оптимальный вариант для меня по скорости работы и удобству -- это статически выделенный на этапе инициализации двумерный массив. На его базе основан кольцевой буфер с доступом из разных мест через DVR. Захват доступа через семафор. Оказалось довольно удобно и гибко в итоге. Пробовал сделать через класс, но как оказалось на RIO они работали медленнее, чем DVR.

PS/ DVR это не про способ хранения, это про способ доступа. По своей сути -- просто ссылка. А, скорость, удобство работы и прочее уже зависит от реализации той сущности на которую будет указывать ваш DVR.
Дорогу осилит идущий.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2008
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: Передача данных DVR vs Queue

Сообщение Borjomy_1 »

Доступ к DVR, к сожалению, производится через поток. Присутствует наличие состояния гонки, которое необходимо обрамлять семафорами, а также большое время доступа, сравнимое с очередью. И что самое неприятное - доступ к данным всегда происходит с копированием - это особенно неприятно при манипуляциях с кольцевым буфером.
Если надо быстродействующий буфер, то лучше оформлять его посредством VI с циклом While внутри. В таком случае нет гонки, можно организовать кольцевой буфер. Меньше итераций с памятью.
ИМХО
Вложения
буфер датчика.png
SD_Приемный буфер датчика матричного Lite.vi
(28.65 КБ) 16 скачиваний
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3641
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2020
Благодарил (а): 3 раза
Поблагодарили: 35 раз
Контактная информация:

Re: Передача данных DVR vs Queue

Сообщение dadreamer »

Borjomy_1 писал(а): 25 авг 2020, 18:04Доступ к DVR, к сожалению, производится через поток.
Если имеется в виду переключение контекста в UI Thread, то чтение/запись для DVR не задействуют UI-поток.
Untitled 1.vi
lv2014
(9.25 КБ) 19 скачиваний
Или подразумевалось что-то другое?
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2487
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 15 раз
Поблагодарили: 68 раз
Контактная информация:

Re: Передача данных DVR vs Queue

Сообщение Artem.spb »

Borjomy_1 писал(а): 25 авг 2020, 18:04 Присутствует наличие состояния гонки, которое необходимо обрамлять семафорами
Откуда подозрения в гонке? Я когда разбирался с ними, провёл простой тест:
dvr.png
в писателе специально бешеную паузу поставил, и видно, что читатель ждёт, пока данные освободятся.
Аватара пользователя
jane_wild
adviser
adviser
Сообщения: 234
Зарегистрирован: 30 июн 2016, 02:11
Версия LabVIEW: 2020
Благодарил (а): 18 раз
Поблагодарили: 2 раза

Re: Передача данных DVR vs Queue

Сообщение jane_wild »

в писателе специально бешеную паузу поставил, и видно, что читатель ждёт, пока данные освободятся.
Модернизировала Ваш VI, добавила еще одиного читателя и поигралась с задержками - очень познавательно!
Спасибо, я не знала об этом свойстве DVR. Я имею ввиду что если данные не обновились, то чтения не происходит.
Learn DVR.png
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Передача данных DVR vs Queue

Сообщение ujin »

Artem.spb писал(а): 25 авг 2020, 21:35 читатель ждёт, пока данные освободятся.
Читатели могут не ждать друг друга. Но писатель все равно ждет пока прочитают.
Вложения
DVR.png
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Передача данных DVR vs Queue

Сообщение ujin »

jane_wild писал(а): 25 авг 2020, 22:52 Я имею ввиду что если данные не обновились, то чтения не происходит.
Чтение не происходит если ссылка занята писателем
Вложения
DVR1.png
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2008
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: Передача данных DVR vs Queue

Сообщение Borjomy_1 »

dadreamer писал(а): 25 авг 2020, 20:10 Или подразумевалось что-то другое?
подразумевалось вот это
Даю специально картинку, потому что снапшот вставляет узлы, которые на порядок снижают быстродействие. Надо брать VI. Интересно получается, что модификация данных производится без копирования, как я вначале писал. Среднее время выполнения для LV2012 - ~2мкс на цикл, а на LV2009 - 1.5мкс(!). От размера массива время не зависит. Вставка вместо локальных переменных кнопки "стоп" свойства "Value" увеличивает время цикла до 55 мкс, независимо - линкованное или по референсу
Вложения
Untitled 3.vi
(11.98 КБ) 20 скачиваний
Снимок.PNG
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2487
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 15 раз
Поблагодарили: 68 раз
Контактная информация:

Re: Передача данных DVR vs Queue

Сообщение Artem.spb »

ujin писал(а): 26 авг 2020, 02:42
Artem.spb писал(а): 25 авг 2020, 21:35 читатель ждёт, пока данные освободятся.
Читатели могут не ждать друг друга. Но писатель все равно ждет пока прочитают.
а как можно организовать читателя? не нашёл таких суперспособностей в этих узлах
Artem.spb

Activity Автор
doctor
doctor
Сообщения: 2487
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 15 раз
Поблагодарили: 68 раз
Контактная информация:

Re: Передача данных DVR vs Queue

Сообщение Artem.spb »

Borjomy_1 писал(а): 26 авг 2020, 11:41 подразумевалось вот это
я так и не понял, что же подразумевалось
+ у вас в коде пара сомнительных мест
race.PNG
1 - никакой гарантии, что стоп будет сброшен до начала цикла.
2 - выделение 100М точек требует времени, и засечка момента "старта" неопределённая.
3 - чтение происходит в "потоке", просто потому, что данные отображаются, да ещё и на график, да ещё и с автошкалированием. Вполне себе обоснованно, что этот цикл работает медленнее писателя. Т.е. само чтение от UI не зависит, но оно с ним в связке.
ujin
user
user
Сообщения: 94
Зарегистрирован: 28 июл 2019, 13:16
Версия LabVIEW: 19
Благодарил (а): 2 раза
Поблагодарили: 3 раза

Re: Передача данных DVR vs Queue

Сообщение ujin »

Artem.spb писал(а): 26 авг 2020, 13:48 а как можно организовать читателя? не нашёл таких суперспособностей в этих узлах
правой кнопкой мыши на правом узле Add Data Value Reference Read / Write Element. (by right-clicking the border node on the right of the structure and selecting Allow Parallel Read-only Access.)
Вложения
DVR_R1.png
DVR_R2.png
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2008
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 11 раз
Поблагодарили: 7 раз

Re: Передача данных DVR vs Queue

Сообщение Borjomy_1 »

Artem.spb писал(а): 26 авг 2020, 13:58 я так и не понял, что же подразумевалось
+ у вас в коде пара сомнительных мест
race.PNG

1 - никакой гарантии, что стоп будет сброшен до начала цикла.
2 - выделение 100М точек требует времени, и засечка момента "старта" неопределённая.
3 - чтение происходит в "потоке", просто потому, что данные отображаются, да ещё и на график, да ещё и с автошкалированием. Вполне себе обоснованно, что этот цикл работает медленнее писателя. Т.е. само чтение от UI не зависит, но оно с ним в связке.
Код тестовый. На двух платформах работает одинаково, имеет высокую повторяемость. Автошкалирование по факту не работает, так как активна опция Loose Fit. Разница производительности между циклами несущественная, в том числе потому, что отображение на графике производится в потоке UI.
Если стоп будет сброшен позже, то, очевидно, визуально тест работать не будет. В этом нет ничего страшного. Выделение памяти под массив происходит единовременно после первого запуска (изменения размера массива).
Все это на измерения НЕ ВЛИЯЕТ.
Две микросекунды на операцию простой записи одного дабла в массив сравните с 50 нс работы с массивом напрямую. Разница в 40 раз.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Модели программирования»