Буферизация больших массивов данных

Простейшие вопросы в области инженерной разработки
temples
assistant
assistant
Сообщения: 103
Зарегистрирован: 25 фев 2015, 10:00
Версия LabVIEW: 14.0f1
Контактная информация:

Буферизация больших массивов данных

Сообщение temples »

Уважаемые коллеги!
Есть следующая, достаточно стандартная, задача. Программа собирает данные измерений с 1000 каналов с периодом 1 сек или несколько реже. Все данные должны сохраняться на диск. Кроме того, оператор должен иметь возможность выборочно просматривать на экране одновременно несколько десятков графиков текущих значений (длина истории, скажем, неделя). Не хочу изобретать велосипед, поэтому прошу подсказать, какими средствами LabVIEW оптимальнее всего реализовать данную систему? Меня более интересуют организация буфера и отображение графиков.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение Kosist »

temples писал(а):одновременно несколько десятков графиков текущих значений (длина истории, скажем, неделя)
Текущих значений, или историю значений (считывать их из файла)? Длина истории - неделя, это немало, могут быть проблемы с отображением всех точек, да еще и с нескольких каналов одновременно.
А какое количество точек считывается с канала за один отсчет, т.е. какой sample rate?
В качестве буфера можно использовать очереди, но в разумных пределах - все будет тогда зависеть от организации записи в файл, и отображении - ведь очередь нужно будет быстро очищать, дабы не забить всю память.
А какое хранилище для файлов используется? Например, 28 каналов при семп рейт 100 kS/s забивают 2-терабайтный NAS менее, чем за сутки. С каким объемом файлов/данных в целом Вы работаете?
Мы делили апельсин - много наших полегло...
temples
assistant
assistant
Сообщения: 103
Зарегистрирован: 25 фев 2015, 10:00
Версия LabVIEW: 14.0f1
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение temples »

Не думаю, что есть смысл городить огород с чтением старых значений из файлов. Под "историей" имеется в виду период от "сейчас" до 1 недели назад. Кому будут нужны более старые данные - возьмёт из файлов и обработает сторонней программой. Т.е. мой софт не предназначен для анализа - только сбор и простая визуализация. Из каждого канала считывается только одна точка в секунду, на хранение которой достаточно выделить 2 байта. Таким образом, за неделю набежит всего 1,2 Гб. Не столь и много, всё можно хранить в ОЗУ. Конечно, я могу выделить нужный буферный массив и оперировать с ним, но предполагаю, что в LabVIEW существуют более удобные механизмы.

При выводе большого количества данных на график, возможно, их надо будет прореживать. Меня более интересует вопрос, каким типом графиков пользоваться. С одной стороны, вроде Waveform chart, имеющий историю, может сильно облегчить жизнь. Но, с другой, мне активно не нравится отсутствие возможности записывать реальное врамя каждого отсчёта. Использование dt ведёт к заметному дрейфу временной шкалы.
Аватара пользователя
Super Star
adviser
adviser
Сообщения: 228
Зарегистрирован: 07 фев 2013, 08:37
Версия LabVIEW: 2011

Re: Буферизация больших массивов данных

Сообщение Super Star »

temples писал(а):мне активно не нравится отсутствие возможности записывать реальное врамя каждого отсчёта.
XY граф поможет вам
я люблю свою работу.... Я приду сюда в субботу ...
temples
assistant
assistant
Сообщения: 103
Зарегистрирован: 25 фев 2015, 10:00
Версия LabVIEW: 14.0f1
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение temples »

Super Star писал(а):XY граф поможет вам
Угу, а чтобы показывать вновь поступающие данные в реальном времени надо каждый раз его перерисовывать?
temples
assistant
assistant
Сообщения: 103
Зарегистрирован: 25 фев 2015, 10:00
Версия LabVIEW: 14.0f1
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение temples »

Хорошо, видимо придётся решать самостоятельно. Тогда два других вопроса.
1). Как узнать текущее количество точек в буфере Waveform Chart ?
2). Есть несколько графиков, показывающих данные одновременно считываемых каналов. Юзер начинает менять диапазон X на одном из графиков. Хотелось бы, чтобы синхронно менялся вид и всех остальных.
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение Kosist »

1. Property Node -> History Data - и узнаете длинну массива.
2. Property Node -> X Scale -> Range -> Minimum. С одного графика считываете, во второй записываете значения свойства. Так можно менять шкалу по оси Х.
Вложения
charts.PNG
charts.PNG (8.71 КБ) 5590 просмотров
Мы делили апельсин - много наших полегло...
temples
assistant
assistant
Сообщения: 103
Зарегистрирован: 25 фев 2015, 10:00
Версия LabVIEW: 14.0f1
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение temples »

Kosist писал(а):1. Property Node -> History Data - и узнаете длинну массива.
Интересно! А я полагал, что так можно только постоянную длину буфера узнать (ту, про которую везде пишут, что она по умолчанию равна 1024).
Kosist писал(а):2. Property Node -> X Scale -> Range -> Minimum. С одного графика считываете, во второй записываете значения свойства. Так можно менять шкалу по оси Х.
Да, но это если юзер будет только первый график дёргать. А если второй? А если графиков 50?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение Kosist »

temples писал(а):Да, но это если юзер будет только первый график дёргать. А если второй? А если графиков 50?
В таком случае, нужно проявить фантазию ))) Что-то вроде этого:
Вложения
ChartsMany.PNG
Charts.vi
(28.65 КБ) 69 скачиваний
Мы делили апельсин - много наших полегло...
Аватара пользователя
dadreamer

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

Re: Буферизация больших массивов данных

Сообщение dadreamer »

Kosist, а не проще так:
Traverse.png
Traverse.png (21.25 КБ) 5571 просмотр
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение Kosist »

dadreamer писал(а):Kosist, а не проще так:
Traverse.png
А-а, не знал ... Изобретал велосипед, значит :think: )
Мы делили апельсин - много наших полегло...
temples
assistant
assistant
Сообщения: 103
Зарегистрирован: 25 фев 2015, 10:00
Версия LabVIEW: 14.0f1
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение temples »

Kosist, спасибо! Так и собирался делать.
dadreamer, прошу прощения, но мало что из диаграммы понял :dntknw:

Во всяком случае, вопрос с графиками теперь остро не стоит. Но хотел бы вернуться к началу, забыв о графиках.
Итак, поступающие с датчиков данные пишутся в буфер, откуда (например, раз в час) сбрасываются на диск. Так и не могу понять, как правильно организовать буфер средствами LabVIEW. В моём понимании, надо выделить массив с помощью Initialize Array, а также иметь переменную, указывающую позицию для записи следующей порции данных. По прошествии нужного периода времени накопленные данные сохраняются, а переменная обнуляется, чтобы вновь указывать на начало буферного массива. Подозреваю, однако, что в LabVIEW правильнее использовать очереди. Не мог бы кто-нибудь набросать пример?
Аватара пользователя
Kosist

Activity Gold
expert
expert
Сообщения: 1236
Зарегистрирован: 21 фев 2011, 23:44
Награды: 2
Версия LabVIEW: 2013-2020
Благодарил (а): 23 раза
Поблагодарили: 30 раз
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение Kosist »

Вы все правильно написали, можно так делать. Высылаю небольшой пример.
А по поводу примера уважаемого dadreamer, подозреваю, что Вы не нашли данную :vi: в палитре. Для этого, Вам нужно активировать VI Scripting - http://zone.ni.com/reference/en-XX/help ... scripting/ . Тогда Вы тоже сможете найти виайку, которую использовал dadreamer
Вложения
Buffer.vi
(22.34 КБ) 79 скачиваний
Example.PNG
Мы делили апельсин - много наших полегло...
temples
assistant
assistant
Сообщения: 103
Зарегистрирован: 25 фев 2015, 10:00
Версия LabVIEW: 14.0f1
Контактная информация:

Re: Буферизация больших массивов данных

Сообщение temples »

Kosist писал(а):Высылаю небольшой пример.
Спасибо, то, что нужно!
Kosist писал(а):А по поводу примера уважаемого dadreamer, подозреваю, что Вы не нашли данную :vi: в палитре.
Именно так. Теперь разобрался. Благодарю!
Аватара пользователя
dadreamer

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

Re: Буферизация больших массивов данных

Сообщение dadreamer »

dadreamer писал(а):Изображение
Внезапно оказалось, что после Traverse for GObjects.vi нужно непременно закрывать все ссылки (Close Reference) после работы с ними, иначе будет утечка памяти, равная числу открытых ссылок на одной итерации программы, помноженному на 4 байта. В этом отличие этого инструмента от TRef Get All FP References.vi, после которого ссылки закрывать не надо, т.к. они не меняются при многократном использовании. Очевидно, что в первом случае создаётся дополнительная копия, но почему так - непонятно. Видимо, это особенность оператора Traverse класса Front Panel.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Для чайников»