Буферизация больших массивов данных
-
- assistant
- Сообщения: 103
- Зарегистрирован: 25 фев 2015, 10:00
- Версия LabVIEW: 14.0f1
- Контактная информация:
Буферизация больших массивов данных
Уважаемые коллеги!
Есть следующая, достаточно стандартная, задача. Программа собирает данные измерений с 1000 каналов с периодом 1 сек или несколько реже. Все данные должны сохраняться на диск. Кроме того, оператор должен иметь возможность выборочно просматривать на экране одновременно несколько десятков графиков текущих значений (длина истории, скажем, неделя). Не хочу изобретать велосипед, поэтому прошу подсказать, какими средствами LabVIEW оптимальнее всего реализовать данную систему? Меня более интересуют организация буфера и отображение графиков.
Есть следующая, достаточно стандартная, задача. Программа собирает данные измерений с 1000 каналов с периодом 1 сек или несколько реже. Все данные должны сохраняться на диск. Кроме того, оператор должен иметь возможность выборочно просматривать на экране одновременно несколько десятков графиков текущих значений (длина истории, скажем, неделя). Не хочу изобретать велосипед, поэтому прошу подсказать, какими средствами LabVIEW оптимальнее всего реализовать данную систему? Меня более интересуют организация буфера и отображение графиков.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Буферизация больших массивов данных
Текущих значений, или историю значений (считывать их из файла)? Длина истории - неделя, это немало, могут быть проблемы с отображением всех точек, да еще и с нескольких каналов одновременно.temples писал(а):одновременно несколько десятков графиков текущих значений (длина истории, скажем, неделя)
А какое количество точек считывается с канала за один отсчет, т.е. какой sample rate?
В качестве буфера можно использовать очереди, но в разумных пределах - все будет тогда зависеть от организации записи в файл, и отображении - ведь очередь нужно будет быстро очищать, дабы не забить всю память.
А какое хранилище для файлов используется? Например, 28 каналов при семп рейт 100 kS/s забивают 2-терабайтный NAS менее, чем за сутки. С каким объемом файлов/данных в целом Вы работаете?
Мы делили апельсин - много наших полегло...
-
- assistant
- Сообщения: 103
- Зарегистрирован: 25 фев 2015, 10:00
- Версия LabVIEW: 14.0f1
- Контактная информация:
Re: Буферизация больших массивов данных
Не думаю, что есть смысл городить огород с чтением старых значений из файлов. Под "историей" имеется в виду период от "сейчас" до 1 недели назад. Кому будут нужны более старые данные - возьмёт из файлов и обработает сторонней программой. Т.е. мой софт не предназначен для анализа - только сбор и простая визуализация. Из каждого канала считывается только одна точка в секунду, на хранение которой достаточно выделить 2 байта. Таким образом, за неделю набежит всего 1,2 Гб. Не столь и много, всё можно хранить в ОЗУ. Конечно, я могу выделить нужный буферный массив и оперировать с ним, но предполагаю, что в LabVIEW существуют более удобные механизмы.
При выводе большого количества данных на график, возможно, их надо будет прореживать. Меня более интересует вопрос, каким типом графиков пользоваться. С одной стороны, вроде Waveform chart, имеющий историю, может сильно облегчить жизнь. Но, с другой, мне активно не нравится отсутствие возможности записывать реальное врамя каждого отсчёта. Использование dt ведёт к заметному дрейфу временной шкалы.
При выводе большого количества данных на график, возможно, их надо будет прореживать. Меня более интересует вопрос, каким типом графиков пользоваться. С одной стороны, вроде Waveform chart, имеющий историю, может сильно облегчить жизнь. Но, с другой, мне активно не нравится отсутствие возможности записывать реальное врамя каждого отсчёта. Использование dt ведёт к заметному дрейфу временной шкалы.
- Super Star
- adviser
- Сообщения: 228
- Зарегистрирован: 07 фев 2013, 08:37
- Версия LabVIEW: 2011
Re: Буферизация больших массивов данных
XY граф поможет вамtemples писал(а):мне активно не нравится отсутствие возможности записывать реальное врамя каждого отсчёта.
я люблю свою работу.... Я приду сюда в субботу ...
-
- assistant
- Сообщения: 103
- Зарегистрирован: 25 фев 2015, 10:00
- Версия LabVIEW: 14.0f1
- Контактная информация:
Re: Буферизация больших массивов данных
Угу, а чтобы показывать вновь поступающие данные в реальном времени надо каждый раз его перерисовывать?Super Star писал(а):XY граф поможет вам
-
- assistant
- Сообщения: 103
- Зарегистрирован: 25 фев 2015, 10:00
- Версия LabVIEW: 14.0f1
- Контактная информация:
Re: Буферизация больших массивов данных
Хорошо, видимо придётся решать самостоятельно. Тогда два других вопроса.
1). Как узнать текущее количество точек в буфере Waveform Chart ?
2). Есть несколько графиков, показывающих данные одновременно считываемых каналов. Юзер начинает менять диапазон X на одном из графиков. Хотелось бы, чтобы синхронно менялся вид и всех остальных.
1). Как узнать текущее количество точек в буфере Waveform Chart ?
2). Есть несколько графиков, показывающих данные одновременно считываемых каналов. Юзер начинает менять диапазон X на одном из графиков. Хотелось бы, чтобы синхронно менялся вид и всех остальных.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Буферизация больших массивов данных
1. Property Node -> History Data - и узнаете длинну массива.
2. Property Node -> X Scale -> Range -> Minimum. С одного графика считываете, во второй записываете значения свойства. Так можно менять шкалу по оси Х.
2. Property Node -> X Scale -> Range -> Minimum. С одного графика считываете, во второй записываете значения свойства. Так можно менять шкалу по оси Х.
- Вложения
-
- charts.PNG (8.71 КБ) 5590 просмотров
Мы делили апельсин - много наших полегло...
-
- assistant
- Сообщения: 103
- Зарегистрирован: 25 фев 2015, 10:00
- Версия LabVIEW: 14.0f1
- Контактная информация:
Re: Буферизация больших массивов данных
Интересно! А я полагал, что так можно только постоянную длину буфера узнать (ту, про которую везде пишут, что она по умолчанию равна 1024).Kosist писал(а):1. Property Node -> History Data - и узнаете длинну массива.
Да, но это если юзер будет только первый график дёргать. А если второй? А если графиков 50?Kosist писал(а):2. Property Node -> X Scale -> Range -> Minimum. С одного графика считываете, во второй записываете значения свойства. Так можно менять шкалу по оси Х.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Буферизация больших массивов данных
В таком случае, нужно проявить фантазию ))) Что-то вроде этого:temples писал(а):Да, но это если юзер будет только первый график дёргать. А если второй? А если графиков 50?
- Вложения
-
- Charts.vi
- (28.65 КБ) 69 скачиваний
Мы делили апельсин - много наших полегло...
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Буферизация больших массивов данных
А-а, не знал ... Изобретал велосипед, значит )dadreamer писал(а):Kosist, а не проще так:
Мы делили апельсин - много наших полегло...
-
- assistant
- Сообщения: 103
- Зарегистрирован: 25 фев 2015, 10:00
- Версия LabVIEW: 14.0f1
- Контактная информация:
Re: Буферизация больших массивов данных
Kosist, спасибо! Так и собирался делать.
dadreamer, прошу прощения, но мало что из диаграммы понял
Во всяком случае, вопрос с графиками теперь остро не стоит. Но хотел бы вернуться к началу, забыв о графиках.
Итак, поступающие с датчиков данные пишутся в буфер, откуда (например, раз в час) сбрасываются на диск. Так и не могу понять, как правильно организовать буфер средствами LabVIEW. В моём понимании, надо выделить массив с помощью Initialize Array, а также иметь переменную, указывающую позицию для записи следующей порции данных. По прошествии нужного периода времени накопленные данные сохраняются, а переменная обнуляется, чтобы вновь указывать на начало буферного массива. Подозреваю, однако, что в LabVIEW правильнее использовать очереди. Не мог бы кто-нибудь набросать пример?
dadreamer, прошу прощения, но мало что из диаграммы понял
Во всяком случае, вопрос с графиками теперь остро не стоит. Но хотел бы вернуться к началу, забыв о графиках.
Итак, поступающие с датчиков данные пишутся в буфер, откуда (например, раз в час) сбрасываются на диск. Так и не могу понять, как правильно организовать буфер средствами LabVIEW. В моём понимании, надо выделить массив с помощью Initialize Array, а также иметь переменную, указывающую позицию для записи следующей порции данных. По прошествии нужного периода времени накопленные данные сохраняются, а переменная обнуляется, чтобы вновь указывать на начало буферного массива. Подозреваю, однако, что в LabVIEW правильнее использовать очереди. Не мог бы кто-нибудь набросать пример?
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Буферизация больших массивов данных
Вы все правильно написали, можно так делать. Высылаю небольшой пример.
А по поводу примера уважаемого dadreamer, подозреваю, что Вы не нашли данную в палитре. Для этого, Вам нужно активировать VI Scripting - http://zone.ni.com/reference/en-XX/help ... scripting/ . Тогда Вы тоже сможете найти виайку, которую использовал dadreamer
А по поводу примера уважаемого dadreamer, подозреваю, что Вы не нашли данную в палитре. Для этого, Вам нужно активировать VI Scripting - http://zone.ni.com/reference/en-XX/help ... scripting/ . Тогда Вы тоже сможете найти виайку, которую использовал dadreamer
- Вложения
-
- Buffer.vi
- (22.34 КБ) 79 скачиваний
Мы делили апельсин - много наших полегло...
-
- assistant
- Сообщения: 103
- Зарегистрирован: 25 фев 2015, 10:00
- Версия LabVIEW: 14.0f1
- Контактная информация:
Re: Буферизация больших массивов данных
Спасибо, то, что нужно!Kosist писал(а):Высылаю небольшой пример.
Именно так. Теперь разобрался. Благодарю!Kosist писал(а):А по поводу примера уважаемого dadreamer, подозреваю, что Вы не нашли данную в палитре.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 126 раз
- Контактная информация:
Re: Буферизация больших массивов данных
Внезапно оказалось, что после Traverse for GObjects.vi нужно непременно закрывать все ссылки (Close Reference) после работы с ними, иначе будет утечка памяти, равная числу открытых ссылок на одной итерации программы, помноженному на 4 байта. В этом отличие этого инструмента от TRef Get All FP References.vi, после которого ссылки закрывать не надо, т.к. они не меняются при многократном использовании. Очевидно, что в первом случае создаётся дополнительная копия, но почему так - непонятно. Видимо, это особенность оператора Traverse класса Front Panel.dadreamer писал(а):
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 23 Ответы
- 4574 Просмотры
-
Последнее сообщение maxim_MA
-
- 3 Ответы
- 855 Просмотры
-
Последнее сообщение IvanLis
-
- 13 Ответы
- 1191 Просмотры
-
Последнее сообщение Boxa
-
- 0 Ответы
- 486 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 263 Просмотры
-
Последнее сообщение AndreyDmitriev