Быстрое чтение разнотипных данных

Работа с файлами и базами данных
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Быстрое чтение разнотипных данных

Сообщение XAPOH »

Здравствуйте. Проблема кажется глупой, но я никак не могу с ней справиться.
Задача которую я пытаюсь решить состоит в следующем:
есть два файла. в А-формат хранимых данных, например (U32,I32,U32,U32,U16). в Б-записанные значения в этих форматах (50 штук). Файл Б-бинарный.
Вопросы:
Как динамически создать тип данных для чтения при помощи Read From Binary File? (с ключом "-1" чтобы прочесть сразу весь файл)
Даже если я создаю тип руками при помощи Bundle или Build Array все равно читается не правильно. Как прочитать? (читать по одной записи я не могу, потому что это сейчас файл маленький, он для тестирования. На практике надо будет открывать файлы по 50-100 мб. Учитывая значение максимального размера (4 байта) это будет 50*1024*1024/4=13 107 200 обращений к жесткому диску! Просто невероятно, фантастически долго)

:dntknw: Я пробовал использовать цикл, в нем кейс-структуру и добавлять к массиву нужные типы, а потом полученный массив использовать как тип. При чтении с указанием такого типа значения не совпадают с реально записанными, а вместо 50ти записей Array Size выдает 7. По идее этот способ с массивом и не должен был заработать, так как в Read From Binary File указывается "If the type is an array, string, or cluster containing an array or string, the function assumes that each instance of that data type contains size information. If an instance does not include size information, the function misinterprets the data.", но может кто подскажет как это обойти...
:dntknw: Я пробовал использовать аналогичный подход с циклом и кейс-структурой, но с bundle для создания кластера нужного типа, потому что в этом случае файл Б не должен содержать информацию о количестве элементов, поскольку кластер не содержит массива или строки (or cluster containing an array or string см. выше). К сожаления компилятор отказывается принимать такой код. Если создать в ручную значения всё равно не совпадают, а Array Size выдает 55.
Скрины программы и файлы могу выложить...
Последний раз редактировалось XAPOH 06 июн 2016, 22:47, всего редактировалось 1 раз.
Аватара пользователя
Kosist

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

Re: Быстрое чтение разнотипных данных

Сообщение Kosist »

Я бы не заморачивался, а читал все как числа одного типа (выберите по самому большему значению). Т.к. в массив Вы не сможете добавить данные разных типов - массив может содержать данные только одного типа.
Если бы читались строки, и числа - тогда да, тогда понятно. А так - читайте весь файл (можете прикрепить его сюда, если есть проблемы просто с чтением), и все...
Мы делили апельсин - много наших полегло...
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Re: Быстрое чтение разнотипных данных

Сообщение XAPOH »

читал все как числа одного типа (выберите по самому большему значению)
Так какой тип выбирать то?? У них же разная длина. Если в файле 50 записей U32,U32,U32,U32,U16. Если все читать в массив U32 то наткнувшись на U16 я захвачу его и два байта от следующей записи в формате U32, получив какое то число содержащие куски данных из двух записей в одной ячейке массива. Если потом производить обработку с учетом сдвигов и прочего, то встает вопрос о целесообразности лаб вью для данной задачи в принципе...
в массив Вы не сможете добавить данные разных типов
И правда... я думал раз лаб вью не выдает ошибку при компиляции то все хорошо... Приложу скриншоты, правда с записью в файл, но суть не поменяется.
Изображение
Сейчас перепроверил в hex-редакторе. Оказалось данные приводятся автоматически к типу большей размерности. Скриншот в hex-редакторе для подтверждения.
Изображение
Красным подчеркнута первая запись (черной полосой отчеркнуто как она должна заканчиваться по правильному). Зеленым вторая.
Оказалось что мой тестовый файл не правильно сформирован, как починю-выложу. Но проблема с тем как быстро прочитать файл в таком формате все еще осталась...
Аватара пользователя
dadreamer

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

Re: Быстрое чтение разнотипных данных

Сообщение dadreamer »

А почему бы не прочитать файлы как массив байт, а в :labview: уже разбирать их согласно формату? Это было бы проще, чем изобретать хитрое чтение файлов.
XAPOH, размещение изображений на сторонних хостингах запрещено правилами форума.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: Быстрое чтение разнотипных данных

Сообщение Blackman »

Сейчас перепроверил в hex-редакторе. Оказалось данные приводятся автоматически к типу большей размерности. Скриншот в hex-редакторе для подтверждения.
Это и так было понятно из блок диаграммы записи в файл. В Build Array для пятого параметра U16 LabVIEW показывает coerсion dot.
Coercion dots appear on block diagram nodes to alert you that LabVIEW converted the value passed into the node to a different representation
Это значит, что в этом месте происходит конвертация значения параметра U16 в значения параметра U32, а длина одной записи будет равна 5 х 4 = 20 байтов.
Для чтения используйте Read Binary File с типом данных 2D Array of U32 (так же как при записи). Количество байт для чтения делайте кратным одной записи (20 байт).
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Re: Быстрое чтение разнотипных данных

Сообщение XAPOH »

я уже исправил запись в файл. теперь так:
новый способ сохранения
новый способ сохранения
если читать по байту то есть вероятность что потом будет слишком долго переводить из одного формата в другой.
Я проверил, теперь если тип задавать в ручную при помощи bundle-чтение файла будет корректным. Осталось разобраться как по строке типа U32,U32,U32,I32,U16 сгенерировать нужный мне тип используя bundle
Аватара пользователя
dadreamer

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

Re: Быстрое чтение разнотипных данных

Сообщение dadreamer »

XAPOH писал(а):если читать по байту то есть вероятность что потом будет слишком долго переводить из одного формата в другой.
Так никто ж не мешает проверить... :wink: Тем более что именно такая операция (преобразование типов) выполняется при чтении файла, т.к. изначально файл читается как набор байт функциями ОС, а уже потом :labview: его интерпретирует.
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Re: Быстрое чтение разнотипных данных

Сообщение XAPOH »

К сожалению компилятор отказывается понимать такой код:
Read_File4.jpg
если развернуть цикл в ручную на 5 бандлов-то все будет работать:
Read_File5.jpg
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Re: Быстрое чтение разнотипных данных

Сообщение XAPOH »

такая операция (преобразование типов) выполняется при чтении файла
я всегда думал весь файл читается в оперативную память без изменений,в один буфер. А потом на начало буфера ставится указатель. И весь фокус в том что тип указателя совпадает с внутренней структурой файла. В этом случае никаких преобразований не происходит, только обращение по адресам в оперативной памяти. А там данные (если все правильно сделано) оказываются совпадающими по типу...
Аватара пользователя
dadreamer

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

Re: Быстрое чтение разнотипных данных

Сообщение dadreamer »

XAPOH писал(а):я всегда думал весь файл читается в оперативную память без изменений,в один буфер. А потом на начало буфера ставится указатель. И весь фокус в том что тип указателя совпадает с внутренней структурой файла. В этом случае никаких преобразований не происходит, только обращение по адресам в оперативной памяти. А там данные (если все правильно сделано) оказываются совпадающими по типу...
Это бы вы в текстовом языке так делали, потому что так естественно делать. А :labview: будет разбирать файл "по винтикам", ибо типы данных :labview: отличны от стандартных и не обязаны совпадать с ними (и часто не совпадают). К тому же копия этих данных нужна непосредственно на БД для формирования контролов/индикаторов заданного типа.
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Re: Быстрое чтение разнотипных данных

Сообщение XAPOH »

Ага. Понял. Я кажется сообразил как правильно теперь задать вопрос!
Возможно ли динамическое создание типа в :labview:? И если возможно то как?
Аватара пользователя
dadreamer

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

Re: Быстрое чтение разнотипных данных

Сообщение dadreamer »

XAPOH писал(а):Возможно ли динамическое создание типа в лаб вью. И если возможно то как?
То есть, чтобы в ран-тайме тип менялся: например, был кластер из чисел, потом стал кластер из строк, потом из массивов и т.п.?
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Re: Быстрое чтение разнотипных данных

Сообщение XAPOH »

Не, чтобы был кластер из 2 Unsigned Int32, а потом стал кластер из 2 Unsigned Int32, N Int32 и K Unsigned Int16. В рантайме. А K и N брались из текстового файла
Аватара пользователя
dadreamer

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

Re: Быстрое чтение разнотипных данных

Сообщение dadreamer »

XAPOH писал(а):Не, чтобы был кластер из 2 Unsigned Int32, а потом стал кластер из 2 Unsigned Int32, N Int32 и K Unsigned Int16. В рантайме. А K и N брались из текстового файла
Кластеры нельзя использовать как динамический тип, т.к. это структура / запись (typedef struct), она генерируется на этапе программирования. Из широко известных динамических типов - строки и массивы. То есть, читаете как массив - переводите в нужный тип. Также со строкой. К вашим услугам волшебные инструменты Type Cast и Flatten To String / Unflatten From String.
Аватара пользователя
XAPOH
beginner
beginner
Сообщения: 28
Зарегистрирован: 20 окт 2010, 15:18
Версия LabVIEW: 8.6; 2013
Контактная информация:

Re: Быстрое чтение разнотипных данных

Сообщение XAPOH »

Я полностью согласен, Unflatten From String изумительный инструмент. Вот только у него сверху надо указать тип, а с ним у меня и есть огромная проблемища.
Из за того что элементы разные по длине (U32 и U16) я не могу указать массив. в нем бывают только однотипные переменные. Поэтому мне придется приводить к кластеру. например такому:
Read_File5.jpg
Но этот тип нельзя объявить динамически, а я заранее не знаю структуру файла который мне отдадут.
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Сохранение данных»