Быстрое чтение разнотипных данных
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Быстрое чтение разнотипных данных
Здравствуйте. Проблема кажется глупой, но я никак не могу с ней справиться.
Задача которую я пытаюсь решить состоит в следующем:
есть два файла. в А-формат хранимых данных, например (U32,I32,U32,U32,U16). в Б-записанные значения в этих форматах (50 штук). Файл Б-бинарный.
Вопросы:
Как динамически создать тип данных для чтения при помощи Read From Binary File? (с ключом "-1" чтобы прочесть сразу весь файл)
Даже если я создаю тип руками при помощи Bundle или Build Array все равно читается не правильно. Как прочитать? (читать по одной записи я не могу, потому что это сейчас файл маленький, он для тестирования. На практике надо будет открывать файлы по 50-100 мб. Учитывая значение максимального размера (4 байта) это будет 50*1024*1024/4=13 107 200 обращений к жесткому диску! Просто невероятно, фантастически долго)
Я пробовал использовать цикл, в нем кейс-структуру и добавлять к массиву нужные типы, а потом полученный массив использовать как тип. При чтении с указанием такого типа значения не совпадают с реально записанными, а вместо 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.", но может кто подскажет как это обойти...
Я пробовал использовать аналогичный подход с циклом и кейс-структурой, но с bundle для создания кластера нужного типа, потому что в этом случае файл Б не должен содержать информацию о количестве элементов, поскольку кластер не содержит массива или строки (or cluster containing an array or string см. выше). К сожаления компилятор отказывается принимать такой код. Если создать в ручную значения всё равно не совпадают, а Array Size выдает 55.
Скрины программы и файлы могу выложить...
Задача которую я пытаюсь решить состоит в следующем:
есть два файла. в А-формат хранимых данных, например (U32,I32,U32,U32,U16). в Б-записанные значения в этих форматах (50 штук). Файл Б-бинарный.
Вопросы:
Как динамически создать тип данных для чтения при помощи Read From Binary File? (с ключом "-1" чтобы прочесть сразу весь файл)
Даже если я создаю тип руками при помощи Bundle или Build Array все равно читается не правильно. Как прочитать? (читать по одной записи я не могу, потому что это сейчас файл маленький, он для тестирования. На практике надо будет открывать файлы по 50-100 мб. Учитывая значение максимального размера (4 байта) это будет 50*1024*1024/4=13 107 200 обращений к жесткому диску! Просто невероятно, фантастически долго)
Я пробовал использовать цикл, в нем кейс-структуру и добавлять к массиву нужные типы, а потом полученный массив использовать как тип. При чтении с указанием такого типа значения не совпадают с реально записанными, а вместо 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.", но может кто подскажет как это обойти...
Я пробовал использовать аналогичный подход с циклом и кейс-структурой, но с bundle для создания кластера нужного типа, потому что в этом случае файл Б не должен содержать информацию о количестве элементов, поскольку кластер не содержит массива или строки (or cluster containing an array or string см. выше). К сожаления компилятор отказывается принимать такой код. Если создать в ручную значения всё равно не совпадают, а Array Size выдает 55.
Скрины программы и файлы могу выложить...
Последний раз редактировалось XAPOH 06 июн 2016, 22:47, всего редактировалось 1 раз.
-
Kosist
- expert
- Сообщения: 1236
- Зарегистрирован: 21 фев 2011, 23:44
- Награды: 2
- Версия LabVIEW: 2013-2020
- Благодарил (а): 23 раза
- Поблагодарили: 30 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Я бы не заморачивался, а читал все как числа одного типа (выберите по самому большему значению). Т.к. в массив Вы не сможете добавить данные разных типов - массив может содержать данные только одного типа.
Если бы читались строки, и числа - тогда да, тогда понятно. А так - читайте весь файл (можете прикрепить его сюда, если есть проблемы просто с чтением), и все...
Если бы читались строки, и числа - тогда да, тогда понятно. А так - читайте весь файл (можете прикрепить его сюда, если есть проблемы просто с чтением), и все...
Мы делили апельсин - много наших полегло...
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Так какой тип выбирать то?? У них же разная длина. Если в файле 50 записей U32,U32,U32,U32,U16. Если все читать в массив U32 то наткнувшись на U16 я захвачу его и два байта от следующей записи в формате U32, получив какое то число содержащие куски данных из двух записей в одной ячейке массива. Если потом производить обработку с учетом сдвигов и прочего, то встает вопрос о целесообразности лаб вью для данной задачи в принципе...читал все как числа одного типа (выберите по самому большему значению)
И правда... я думал раз лаб вью не выдает ошибку при компиляции то все хорошо... Приложу скриншоты, правда с записью в файл, но суть не поменяется.в массив Вы не сможете добавить данные разных типов
Сейчас перепроверил в hex-редакторе. Оказалось данные приводятся автоматически к типу большей размерности. Скриншот в hex-редакторе для подтверждения.
Красным подчеркнута первая запись (черной полосой отчеркнуто как она должна заканчиваться по правильному). Зеленым вторая.
Оказалось что мой тестовый файл не правильно сформирован, как починю-выложу. Но проблема с тем как быстро прочитать файл в таком формате все еще осталась...
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
А почему бы не прочитать файлы как массив байт, а в уже разбирать их согласно формату? Это было бы проще, чем изобретать хитрое чтение файлов.
XAPOH, размещение изображений на сторонних хостингах запрещено правилами форума.
XAPOH, размещение изображений на сторонних хостингах запрещено правилами форума.
-
- leader
- Сообщения: 932
- Зарегистрирован: 17 янв 2016, 15:02
- Награды: 1
- Версия LabVIEW: 6.1,8.5,20
Re: Быстрое чтение разнотипных данных
Это и так было понятно из блок диаграммы записи в файл. В Build Array для пятого параметра U16 LabVIEW показывает coerсion dot.Сейчас перепроверил в hex-редакторе. Оказалось данные приводятся автоматически к типу большей размерности. Скриншот в hex-редакторе для подтверждения.
Это значит, что в этом месте происходит конвертация значения параметра U16 в значения параметра U32, а длина одной записи будет равна 5 х 4 = 20 байтов.Coercion dots appear on block diagram nodes to alert you that LabVIEW converted the value passed into the node to a different representation
Для чтения используйте Read Binary File с типом данных 2D Array of U32 (так же как при записи). Количество байт для чтения делайте кратным одной записи (20 байт).
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
я уже исправил запись в файл. теперь так:
Я проверил, теперь если тип задавать в ручную при помощи bundle-чтение файла будет корректным. Осталось разобраться как по строке типа U32,U32,U32,I32,U16 сгенерировать нужный мне тип используя bundle
если читать по байту то есть вероятность что потом будет слишком долго переводить из одного формата в другой.Я проверил, теперь если тип задавать в ручную при помощи bundle-чтение файла будет корректным. Осталось разобраться как по строке типа U32,U32,U32,I32,U16 сгенерировать нужный мне тип используя bundle
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Так никто ж не мешает проверить... Тем более что именно такая операция (преобразование типов) выполняется при чтении файла, т.к. изначально файл читается как набор байт функциями ОС, а уже потом его интерпретирует.XAPOH писал(а):если читать по байту то есть вероятность что потом будет слишком долго переводить из одного формата в другой.
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
К сожалению компилятор отказывается понимать такой код:
если развернуть цикл в ручную на 5 бандлов-то все будет работать:
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
я всегда думал весь файл читается в оперативную память без изменений,в один буфер. А потом на начало буфера ставится указатель. И весь фокус в том что тип указателя совпадает с внутренней структурой файла. В этом случае никаких преобразований не происходит, только обращение по адресам в оперативной памяти. А там данные (если все правильно сделано) оказываются совпадающими по типу...такая операция (преобразование типов) выполняется при чтении файла
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Это бы вы в текстовом языке так делали, потому что так естественно делать. А будет разбирать файл "по винтикам", ибо типы данных отличны от стандартных и не обязаны совпадать с ними (и часто не совпадают). К тому же копия этих данных нужна непосредственно на БД для формирования контролов/индикаторов заданного типа.XAPOH писал(а):я всегда думал весь файл читается в оперативную память без изменений,в один буфер. А потом на начало буфера ставится указатель. И весь фокус в том что тип указателя совпадает с внутренней структурой файла. В этом случае никаких преобразований не происходит, только обращение по адресам в оперативной памяти. А там данные (если все правильно сделано) оказываются совпадающими по типу...
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Ага. Понял. Я кажется сообразил как правильно теперь задать вопрос!
Возможно ли динамическое создание типа в ? И если возможно то как?
Возможно ли динамическое создание типа в ? И если возможно то как?
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
То есть, чтобы в ран-тайме тип менялся: например, был кластер из чисел, потом стал кластер из строк, потом из массивов и т.п.?XAPOH писал(а):Возможно ли динамическое создание типа в лаб вью. И если возможно то как?
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Не, чтобы был кластер из 2 Unsigned Int32, а потом стал кластер из 2 Unsigned Int32, N Int32 и K Unsigned Int16. В рантайме. А K и N брались из текстового файла
-
dadreamer
- professor
- Сообщения: 3926
- Зарегистрирован: 17 фев 2013, 16:33
- Награды: 4
- Версия LabVIEW: 2.5 — 2022
- Благодарил (а): 11 раз
- Поблагодарили: 127 раз
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Кластеры нельзя использовать как динамический тип, т.к. это структура / запись (typedef struct), она генерируется на этапе программирования. Из широко известных динамических типов - строки и массивы. То есть, читаете как массив - переводите в нужный тип. Также со строкой. К вашим услугам волшебные инструменты Type Cast и Flatten To String / Unflatten From String.XAPOH писал(а):Не, чтобы был кластер из 2 Unsigned Int32, а потом стал кластер из 2 Unsigned Int32, N Int32 и K Unsigned Int16. В рантайме. А K и N брались из текстового файла
- XAPOH
- beginner
- Сообщения: 28
- Зарегистрирован: 20 окт 2010, 15:18
- Версия LabVIEW: 8.6; 2013
- Контактная информация:
Re: Быстрое чтение разнотипных данных
Я полностью согласен, Unflatten From String изумительный инструмент. Вот только у него сверху надо указать тип, а с ним у меня и есть огромная проблемища.
Из за того что элементы разные по длине (U32 и U16) я не могу указать массив. в нем бывают только однотипные переменные. Поэтому мне придется приводить к кластеру. например такому: Но этот тип нельзя объявить динамически, а я заранее не знаю структуру файла который мне отдадут.
Из за того что элементы разные по длине (U32 и U16) я не могу указать массив. в нем бывают только однотипные переменные. Поэтому мне придется приводить к кластеру. например такому: Но этот тип нельзя объявить динамически, а я заранее не знаю структуру файла который мне отдадут.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 0 Ответы
- 506 Просмотры
-
Последнее сообщение Juri
-
- 3 Ответы
- 881 Просмотры
-
Последнее сообщение IvanLis
-
- 13 Ответы
- 1232 Просмотры
-
Последнее сообщение Boxa
-
- 3 Ответы
- 272 Просмотры
-
Последнее сообщение AndreyDmitriev
-
- 13 Ответы
- 2455 Просмотры
-
Последнее сообщение rsv