Быстрое чтение разнотипных данных
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Быстрое чтение разнотипных данных
Не надо изобретать велосипед.)
TDMS File Format Internal Structure
http://www.ni.com/white-paper/5696/en/
VI-Based API for Writing TDMS Files
http://www.ni.com/white-paper/6471/en/
http://ftp.ni.com/pub/devzone/tut/gtdms_8.x.zip
TDMS File Format Internal Structure
http://www.ni.com/white-paper/5696/en/
VI-Based API for Writing TDMS Files
http://www.ni.com/white-paper/6471/en/
http://ftp.ni.com/pub/devzone/tut/gtdms_8.x.zip
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Быстрое чтение разнотипных данных
Тут элементарно. Перед записью указывается ее тип. Сначала считывается тип, потом вызывается соответствующая структура, которая вычитывает данные соответственно типу.XAPOH писал(а):Вот только у него сверху надо указать тип, а с ним у меня и есть огромная проблемища.
Но лучше присмотреться к TDMS
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Перед записью указывается ее тип.
Боюсь что у меня проблема с чтением файлов, а не в записи. Мне предоставят файлы, а я должен построить графикиWriting TDMS Files
К сожалению я не могу выбирать формат подаваемых мне файлов. Может я чего то не понял, но вы мне предлагаете сначала сохранить в TDMS, чтобы потом пользоваться его инструментами и читать. Верно?TDMS File Format
Я думаю должен пояснить, что пытаюсь открыть файлы в формате COMTRADE, стандарта 2013 года. Я знаю что имеет инструмент для их просмотра, входящий в Electrical Power чего то там, но я так и не смог им воспользоваться-он во первых отказался открывать, а во вторых-вроде он был платный. Я уже не помню. Поэтому изучил стандарт COMTRADE 2013 и написал собственный просмотрщик аналоговых сигналов Файлы для просмотра (TrT1.cdf и TrT1.dat) внутри архива.
Когда я решил добавить туда считывание дискретных сигналов(по стандарту они упаковываются в переменные типа U16)-я столкнулся с проблемой, с которой и пришел на форум: как быстро считывать значения из бинарного файла, если там разные по длине переменные? Если хочешь использовать Read From Binary File-то нельзя указывать тип "массив", т.к. во первых сама функция чтения требует указания количества записей, а во вторых в массиве могут быть только переменные одного типа (и соответственно одинаковой длины).
Идеально подходит в качестве типа указывать кластер с нужной структурой (которую читаешь из *.cfg файла)-Read From Binary File его поддерживает, счетчиков в начале файла не нужно, но кластер с нужной структурой нельзя создавать динамически! Я могу руками открыть *.cfg файл, понять сколько переменных какой длины будет, и собрать кластер в качестве типа для Read From Binary File. Но я это делаю руками! Персонально под каждый файл! А значит я никому не могу дать свою программу, потому что ее под каждый файл надо переписывать! Кластеры нельзя динамически типизировать.
От отчаяния я сейчас доделываю следующее решение: читаю весь файл как массив U16, а потом в цикле начинаю объединять те ячейки массива, какие нужно в соответствии с информацией из *.cfg файла и создаю новые массивы U32, I32, I16 в зависимости от этого из исходного U16. Решение мне кажется уродливым, но это лучше чем ничего. Может кто нибудь предложить способ лучше?
Тестовые файлы с 2 аналоговыми и 2 дискретными сигналами:
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
XAPOH писал(а):Может кто нибудь предложить способ лучше?
Я бы так сделал (как впрочем я уже советовал вам): Бесполезно пытаться читать свои собственные форматы через Read From Binary File. Особенно массивы, строки и кластеры из них. ожидает свой формат представления данных: например, перед массивом обязательно должна стоять его длина (I32), перед строкой - так же. Если длины нет, то ни , ни какая-то другая среда просто не во состоянии понять, где заканчивается один массив и начинается другой элемент. Так что для экзотических форматов наподобие вашего лучшим решением будет получать весь поток байт из файла и интерпретировать его согласно текущему формату (полагаю, длины массивов N и K заранее известны, иначе ничего не выйдет).XAPOH писал(а):Не, чтобы был кластер из 2 Unsigned Int32, а потом стал кластер из 2 Unsigned Int32, N Int32 и K Unsigned Int16. В рантайме. А K и N брались из текстового файла
З.Ы.: понятно, что комменты - штука очень личная, но всё же... Здесь же приличная аудитория сидит.
- Вложения
-
- 2016-06-07_20-59-31.jpg (49.84 КБ) 12295 просмотров
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Спасибо большое! С изменившимся ТЗ это решение подходит как нельзя лучше!
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
И снова я в этой теме. Сделал все как советовали, после того как немного изменился формат файла я полностью принял решение. Во время тестов все работало замечательно! Пока в файле было порядка 50 записей. На обработку всех записей уходили миллисекунды.dadreamer писал(а):Я бы так сделал (как впрочем я уже советовал вам):
Теперь программу стали испытывать на практике и в файле 300 000 записей и мои худшие опасения (из за чего я вообще и создавал эту тему) сбылись. Тормозит ужасающе. На обработку одной (!) записи (27 U32 и 1 U16) уходит больше 1 секунды. а записей там, повторюсь, около 300 000. У меня есть смутные подозрения что дело в передаче данных через шифт регистры (теперь там данных стало больше 30 мегабайт), но наверняка я не знаю.
Подскажите как быть, пожалуйста!
Прикладываю архив, форум файл в 2,8мб кушать отказывается: https://yadi.sk/d/fJYLkvWBtGB4W
Файл TrT2.cff-тестовый на 50 записей
Файл Trend_test_10_40.cff-реальный
Чтобы открыть нажимаем на белое поле под цифрой красной 1, выбираем файл, потом на кнопку под красной цифрой 2 Вдогонку вопрос, не могу вспомнить как сделать чтобы элементы на окне автоматически масштабировались под размеры окна?
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Быстрое чтение разнотипных данных
Каждая манипуляция со строками приводит к перераспределению памяти. А вы на КАЖДОМ разборе числа переписываете ВЕСЬ файл, который находится в памяти в виде строки.
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
XAPOH, раз у вас такие большие объёмы данных, то наверное следует читать файл по частям. Не знаю, может, вы уже пробовали это... Вот похожая тема: http://www.labviewportal.org/viewtopic. ... 817#p70817 Только там в начале файла присутствует заголовок, а дальше идут полезные данные. Обратите внимание, что чтение по частям не означает, что нужно прочесть файл за раз (хоть частями, хоть целиком). Это означает, что программа работает только с одной частью (порцией) данных в определённый момент времени.
File -> VI Properties -> Window Size -> галочка "Scale all objects on front panel as the window resizes"XAPOH писал(а):Вдогонку вопрос, не могу вспомнить как сделать чтобы элементы на окне автоматически масштабировались под размеры окна?
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Сделал. Действительно, офигенно ускорилось, спасибо большое. Но у меня теперь вопрос: что делать с порядком байтов? как мне сделать little-endian и вообще как его поменять?Borjomy_1 писал(а):Каждая манипуляция со строками приводит к перераспределению памяти. А вы на КАЖДОМ разборе числа переписываете ВЕСЬ файл, который находится в памяти в виде строки.
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
спасибо, поставилdadreamer писал(а): File -> VI Properties -> Window Size -> галочка "Scale all objects on front panel as the window resizes"
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Быстрое чтение разнотипных данных
Перед TypeCastом сделать реверс массива и послекак мне сделать little-endian и вообще как его поменять?
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
с U32 помогло. сделал после Type Cast сделал Swype BytesBorjomy_1 писал(а):Перед TypeCastом сделать реверс массива и послекак мне сделать little-endian и вообще как его поменять?
а вот с U16 что то не получается. щас похимичу ещё.
а почему нужно перед Type Cast? от этого быстрее работать будет?
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Быстрое чтение разнотипных данных
Перед тайпкастом разворачивается порядок следования байт, но также разворачивается и порядок следования каналов. Реверс массива после преобразования восстанавливает справедливость.
-
- assistant
- Сообщения: 122
- Зарегистрирован: 09 дек 2014, 10:14
- Версия LabVIEW: 7-2015
- Откуда: Санкт-Петербург
- Контактная информация:
Re: Быстрое чтение разнотипных данных
1. Если длина каждой записи известна заранее (информация о длине не записана в структуре посылки), то последовательный парсер нужно заменить на параллельный. Очень большой прирост производительности.
2. Если записи одной длины, то хранить данные в одномерном массиве, а не в двумерном. Если длина разная - использовать одномерный массив кластеров. Большой прирост.
3. Прочитать бинарный файл, целиком сконвертить в тот же u16 и парсить уже массив u16, а не строку. Позволит избежать работы со строкой, шифт регистром, дикого кол-ва преобразований и потенциально распараллелить. Дикий прирост.
4. По возможности не использовать Mixed Signal Graph, поскольку в него входит Digital Graph, который в 2015 версии конечно поправлен, но все равно довольно тормозная штука. Лучше работать с аналогом, а для отображения цифровых использовать аналоговые сигналы конечной амплитуды сдвинутые друг относительно друга. Прирост зависит от проекта и иногда весьма ощутимый.
Это то, что можно сказать не вчитываясь в Ваш код, поскольку вчитываться в него довольно проблематично...
2. Если записи одной длины, то хранить данные в одномерном массиве, а не в двумерном. Если длина разная - использовать одномерный массив кластеров. Большой прирост.
3. Прочитать бинарный файл, целиком сконвертить в тот же u16 и парсить уже массив u16, а не строку. Позволит избежать работы со строкой, шифт регистром, дикого кол-ва преобразований и потенциально распараллелить. Дикий прирост.
4. По возможности не использовать Mixed Signal Graph, поскольку в него входит Digital Graph, который в 2015 версии конечно поправлен, но все равно довольно тормозная штука. Лучше работать с аналогом, а для отображения цифровых использовать аналоговые сигналы конечной амплитуды сдвинутые друг относительно друга. Прирост зависит от проекта и иногда весьма ощутимый.
Это то, что можно сказать не вчитываясь в Ваш код, поскольку вчитываться в него довольно проблематично...
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 0 Ответы
- 503 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 875 Просмотры
-
Последнее сообщение IvanLis
-
- 13 Ответы
- 1228 Просмотры
-
Последнее сообщение Boxa
-
- 3 Ответы
- 272 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 13 Ответы
- 2454 Просмотры
-
Последнее сообщение rsv