Доброго времени, коллеги!
Реализую прием потока данных от периферийной платы.
В настоящее время делаю это таким способом (рисунок). На вход тактируемого цикла поступают данные о периоде, "индекс устройства", глубина буфера и пустой двумерный массив.
В самом цикле производится проверка нажатия кнопки "Receive" разрешающей выполнение операции чтения из указанного индексом устройства.
Считанный буфер, объединяется с массивом (добавляется в "хвост") и так происходит либо до нажатия кнопки "Stop", либо до превышения установленного порога "Maximum".
По окончанию всех итераций производится выход из цикла чтения, двумерный массив передается на обработку.
Внутреннее чутье подсказывает нерациональность построения цикла чтения.
Прежде всего каждый раз растет буфер и пока он "небольшой" (10..40 тыс байт) он работает достаточно шустро, но вот когда потребуется принимать данные длительное время - может просто переполниться память и все труды будут напрасны.
Как хотелось бы видеть рациональную структуру - некий "малоразмерный" буфер (допустим до 1..4кБ), в который будут читаться данные, плюс буфер "большого" размера (несколько сот кБ), в который будут переписываться данные из маленького буфера в то время, пока неактивна тактированная структура с узлом чтения.
Вот теперь собственно вопрос, в какую сторону ковырять (какие элементы задействовать) что бы можно было реализовать задуманное?
(На всякий случай, версия LV 8.5)
Прием данных большой размерности
-
IvanLis
- guru
- Сообщения: 5467
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Прием данных большой размерности
Если я не прав, то думаю меня поправят ....
От переполнения памяти врят ли что-то спасет, разве что писать данные "малыми кучками" в файл, по мере приема. А по окончании, загружать их оттуда и обрабатывать, методы работы с большими файлами уже неоднократно обсасывались на форуме. Но мне кажется это не Ваш случай.
Я бы пошел следующим путем.
Цикл у Вас - время критичный, по этому выполнять в нем операции, которые способные его тормознуть не рекомендуется. Принятые данные нужно накапливать в другом цикле, а передавать их используя очередь (queue).
Что бы снизить задержки, необходимо предварительное резервирование памяти под принятые данные. Т.е. на вход регистра подавать не пустой массив, а массив заранее определенной размерности, у Вас кол-во строк будет Maximum, а столбцов - размер данных принимаемых с устройства. Его Вы должны знать.
По мере приема данные в цикл не "дописываются", а "перезаписываются", т.о. размер массива не изменяется. По окончании приема, принятые данные из него достаются, а незадействованные - отбрасываются.
От переполнения памяти врят ли что-то спасет, разве что писать данные "малыми кучками" в файл, по мере приема. А по окончании, загружать их оттуда и обрабатывать, методы работы с большими файлами уже неоднократно обсасывались на форуме. Но мне кажется это не Ваш случай.
Я бы пошел следующим путем.
Цикл у Вас - время критичный, по этому выполнять в нем операции, которые способные его тормознуть не рекомендуется. Принятые данные нужно накапливать в другом цикле, а передавать их используя очередь (queue).
Что бы снизить задержки, необходимо предварительное резервирование памяти под принятые данные. Т.е. на вход регистра подавать не пустой массив, а массив заранее определенной размерности, у Вас кол-во строк будет Maximum, а столбцов - размер данных принимаемых с устройства. Его Вы должны знать.
По мере приема данные в цикл не "дописываются", а "перезаписываются", т.о. размер массива не изменяется. По окончании приема, принятые данные из него достаются, а незадействованные - отбрасываются.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Re: Прием данных большой размерности
Как раз на работе размышлял по поводу построения логики работы и передачи данных.
Листая Трэвиса натолкнулся на очередь и синхронизацию (в общем как Вы и говорите).
Пока надумал до того, что с одной стороны в циклах пересылать потоки (думаю будет минимум два синхронных, один приемный, а второй для объединения) и видимо придётся пойти по пути записи в файл- ибо спрогнозировать время сбора данных не могу, а их объем будет расти.
Листая Трэвиса натолкнулся на очередь и синхронизацию (в общем как Вы и говорите).
Пока надумал до того, что с одной стороны в циклах пересылать потоки (думаю будет минимум два синхронных, один приемный, а второй для объединения) и видимо придётся пойти по пути записи в файл- ибо спрогнозировать время сбора данных не могу, а их объем будет расти.
Вот за этот совет отдельное спасибо....на вход регистра подавать не пустой массив, а массив заранее определенной размерности...По мере приема данные в цикл не "дописываются", а "перезаписываются", т.о. размер массива не изменяется.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 3 Ответы
- 874 Просмотры
-
Последнее сообщение IvanLis
-
- 13 Ответы
- 1224 Просмотры
-
Последнее сообщение Boxa
-
- 0 Ответы
- 503 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 272 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 13 Ответы
- 2454 Просмотры
-
Последнее сообщение rsv