Передача данных DVR vs Queue
- jane_wild
- master
- Сообщения: 459
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 83 раза
- Поблагодарили: 15 раз
- Контактная информация:
Передача данных DVR vs Queue
Всем здравствуйте. Появился новый проект, обычный сбор данных. Планируется использование, cDAQ с тремя модулями NI9205 (помимо цифровых). следовательно ai каналов будет достаточно много. А поскольку время терпит, то решила в целях самообразования, использовать что то новенькое (для меня). Выбираю способ передачи данных (2D array достаточно большого объема) между DVR и Queue. Где то читала, что физически очереди передают не сами данные, а ссылку на них, если это так, то DVR по сути та же ссылка. И снова вопрос о быстродействии - кто кого? И вообще преимущества и недостатки DVR и очередей. Ребята можете объяснить "на пальцах"
Спасибо.
Спасибо.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Передача данных DVR vs Queue
Откуда и куда данные будете передавать?
DVR подходит только для передачи данных внутри одного устройства.
DVR подходит только для передачи данных внутри одного устройства.
- jane_wild
- master
- Сообщения: 459
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 83 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: Передача данных DVR vs Queue
Я имела ввиду между отдельными VI на одной машине. Эту картинку я видела, но там ничего не сказано о производительности.
Если я правильно понимаю, то главное отличие в том, что в случае с очередями можно организовать непрерывный сбор данных, без потерь (есть буфер). Но в случае задержек с обработкой быстро поступающих и большого объема данных может возникнуть времменной лаг. С DVR лага не будет, но возможны пропуски данных. Мои рассуждения верны?
-
ladik
- developer
- Сообщения: 275
- Зарегистрирован: 18 ноя 2014, 11:45
- Награды: 1
- Версия LabVIEW: 2015, 2019
- Откуда: Екатеринбург
- Благодарил (а): 4 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Передача данных DVR vs Queue
Была подобная задача, только на RIO. 12 аналоговых каналов, 200 семплов/сек, срок хранения данных - в пределах нескольких минут. Методом проб и ошибок пришёл к тому, что самый удобный и оптимальный вариант для меня по скорости работы и удобству -- это статически выделенный на этапе инициализации двумерный массив. На его базе основан кольцевой буфер с доступом из разных мест через DVR. Захват доступа через семафор. Оказалось довольно удобно и гибко в итоге. Пробовал сделать через класс, но как оказалось на RIO они работали медленнее, чем DVR.
PS/ DVR это не про способ хранения, это про способ доступа. По своей сути -- просто ссылка. А, скорость, удобство работы и прочее уже зависит от реализации той сущности на которую будет указывать ваш DVR.
PS/ DVR это не про способ хранения, это про способ доступа. По своей сути -- просто ссылка. А, скорость, удобство работы и прочее уже зависит от реализации той сущности на которую будет указывать ваш DVR.
Дорогу осилит идущий.
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Передача данных DVR vs Queue
Доступ к DVR, к сожалению, производится через поток. Присутствует наличие состояния гонки, которое необходимо обрамлять семафорами, а также большое время доступа, сравнимое с очередью. И что самое неприятное - доступ к данным всегда происходит с копированием - это особенно неприятно при манипуляциях с кольцевым буфером.
Если надо быстродействующий буфер, то лучше оформлять его посредством VI с циклом While внутри. В таком случае нет гонки, можно организовать кольцевой буфер. Меньше итераций с памятью.
ИМХО
Если надо быстродействующий буфер, то лучше оформлять его посредством VI с циклом While внутри. В таком случае нет гонки, можно организовать кольцевой буфер. Меньше итераций с памятью.
ИМХО
- Вложения
-
- SD_Приемный буфер датчика матричного Lite.vi
- (28.65 КБ) 89 скачиваний
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Передача данных DVR vs Queue
Если имеется в виду переключение контекста в UI Thread, то чтение/запись для DVR не задействуют UI-поток. Или подразумевалось что-то другое?
-
- professor
- Сообщения: 3403
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 172 раза
- Контактная информация:
Re: Передача данных DVR vs Queue
Откуда подозрения в гонке? Я когда разбирался с ними, провёл простой тест: в писателе специально бешеную паузу поставил, и видно, что читатель ждёт, пока данные освободятся.
- jane_wild
- master
- Сообщения: 459
- Зарегистрирован: 30 июн 2016, 02:11
- Версия LabVIEW: 2020
- Благодарил (а): 83 раза
- Поблагодарили: 15 раз
- Контактная информация:
Re: Передача данных DVR vs Queue
Модернизировала Ваш VI, добавила еще одиного читателя и поигралась с задержками - очень познавательно!в писателе специально бешеную паузу поставил, и видно, что читатель ждёт, пока данные освободятся.
Спасибо, я не знала об этом свойстве DVR. Я имею ввиду что если данные не обновились, то чтения не происходит.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Передача данных DVR vs Queue
Читатели могут не ждать друг друга. Но писатель все равно ждет пока прочитают.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Передача данных DVR vs Queue
подразумевалось вот это
Даю специально картинку, потому что снапшот вставляет узлы, которые на порядок снижают быстродействие. Надо брать VI. Интересно получается, что модификация данных производится без копирования, как я вначале писал. Среднее время выполнения для LV2012 - ~2мкс на цикл, а на LV2009 - 1.5мкс(!). От размера массива время не зависит. Вставка вместо локальных переменных кнопки "стоп" свойства "Value" увеличивает время цикла до 55 мкс, независимо - линкованное или по референсу
- Вложения
-
- Untitled 3.vi
- (11.98 КБ) 103 скачивания
-
- professor
- Сообщения: 3403
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 172 раза
- Контактная информация:
Re: Передача данных DVR vs Queue
а как можно организовать читателя? не нашёл таких суперспособностей в этих узлах
-
- professor
- Сообщения: 3403
- Зарегистрирован: 31 июл 2011, 23:05
- Награды: 2
- Версия LabVIEW: 12-18
- Благодарил (а): 49 раз
- Поблагодарили: 172 раза
- Контактная информация:
Re: Передача данных DVR vs Queue
я так и не понял, что же подразумевалось
+ у вас в коде пара сомнительных мест 1 - никакой гарантии, что стоп будет сброшен до начала цикла.
2 - выделение 100М точек требует времени, и засечка момента "старта" неопределённая.
3 - чтение происходит в "потоке", просто потому, что данные отображаются, да ещё и на график, да ещё и с автошкалированием. Вполне себе обоснованно, что этот цикл работает медленнее писателя. Т.е. само чтение от UI не зависит, но оно с ним в связке.
-
- user
- Сообщения: 94
- Зарегистрирован: 28 июл 2019, 13:16
- Версия LabVIEW: 19
- Благодарил (а): 2 раза
- Поблагодарили: 3 раза
- Контактная информация:
Re: Передача данных DVR vs Queue
правой кнопкой мыши на правом узле 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.)
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Передача данных DVR vs Queue
Код тестовый. На двух платформах работает одинаково, имеет высокую повторяемость. Автошкалирование по факту не работает, так как активна опция Loose Fit. Разница производительности между циклами несущественная, в том числе потому, что отображение на графике производится в потоке UI.Artem.spb писал(а): ↑26 авг 2020, 13:58 я так и не понял, что же подразумевалось
+ у вас в коде пара сомнительных мест
race.PNG
1 - никакой гарантии, что стоп будет сброшен до начала цикла.
2 - выделение 100М точек требует времени, и засечка момента "старта" неопределённая.
3 - чтение происходит в "потоке", просто потому, что данные отображаются, да ещё и на график, да ещё и с автошкалированием. Вполне себе обоснованно, что этот цикл работает медленнее писателя. Т.е. само чтение от UI не зависит, но оно с ним в связке.
Если стоп будет сброшен позже, то, очевидно, визуально тест работать не будет. В этом нет ничего страшного. Выделение памяти под массив происходит единовременно после первого запуска (изменения размера массива).
Все это на измерения НЕ ВЛИЯЕТ.
Две микросекунды на операцию простой записи одного дабла в массив сравните с 50 нс работы с массивом напрямую. Разница в 40 раз.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 13 Ответы
- 2448 Просмотры
-
Последнее сообщение rsv
-
- 3 Ответы
- 867 Просмотры
-
Последнее сообщение IvanLis
-
- 13 Ответы
- 1220 Просмотры
-
Последнее сообщение Boxa
-
- 0 Ответы
- 498 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 270 Просмотры
-
Последнее сообщение AndreyDmitriev