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

Работа с файлами и базами данных

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

Postby XAPOH on 06 Jun 2016, 15:34

Здравствуйте. Проблема кажется глупой, но я никак не могу с ней справиться.
Задача которую я пытаюсь решить состоит в следующем:
есть два файла. в А-формат хранимых данных, например (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.
Скрины программы и файлы могу выложить...
Last edited by XAPOH on 06 Jun 2016, 22:47, edited 1 time in total.
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

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

Postby Kosist on 06 Jun 2016, 15:55

Я бы не заморачивался, а читал все как числа одного типа (выберите по самому большему значению). Т.к. в массив Вы не сможете добавить данные разных типов - массив может содержать данные только одного типа.
Если бы читались строки, и числа - тогда да, тогда понятно. А так - читайте весь файл (можете прикрепить его сюда, если есть проблемы просто с чтением), и все...
Мы делили апельсин - много наших полегло...
User avatar
Kosist
leader
leader
 
Posts: 817
Joined: 21 Feb 2011, 23:44
Medals: 2
Activity (1) Gold (1)
LabVIEW Version: 2013-2017
Karma: 238
CLAD I/O VIP students

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

Postby XAPOH on 06 Jun 2016, 17:28

читал все как числа одного типа (выберите по самому большему значению)

Так какой тип выбирать то?? У них же разная длина. Если в файле 50 записей U32,U32,U32,U32,U16. Если все читать в массив U32 то наткнувшись на U16 я захвачу его и два байта от следующей записи в формате U32, получив какое то число содержащие куски данных из двух записей в одной ячейке массива. Если потом производить обработку с учетом сдвигов и прочего, то встает вопрос о целесообразности лаб вью для данной задачи в принципе...
в массив Вы не сможете добавить данные разных типов

И правда... я думал раз лаб вью не выдает ошибку при компиляции то все хорошо... Приложу скриншоты, правда с записью в файл, но суть не поменяется.
Image
Сейчас перепроверил в hex-редакторе. Оказалось данные приводятся автоматически к типу большей размерности. Скриншот в hex-редакторе для подтверждения.
Image
Красным подчеркнута первая запись (черной полосой отчеркнуто как она должна заканчиваться по правильному). Зеленым вторая.
Оказалось что мой тестовый файл не правильно сформирован, как починю-выложу. Но проблема с тем как быстро прочитать файл в таком формате все еще осталась...
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

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

Postby dadreamer on 06 Jun 2016, 18:05

А почему бы не прочитать файлы как массив байт, а в :labview: уже разбирать их согласно формату? Это было бы проще, чем изобретать хитрое чтение файлов.
XAPOH, размещение изображений на сторонних хостингах запрещено правилами форума.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby Blackman on 06 Jun 2016, 18:13

Сейчас перепроверил в 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 байт).
Blackman
leader
leader
 
Posts: 720
Joined: 17 Jan 2016, 15:02
Medals: 1
Activity (1)
LabVIEW Version: 6.1,8.5,20
Karma: 187

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

Postby XAPOH on 06 Jun 2016, 18:29

я уже исправил запись в файл. теперь так:
Read_File3.jpg
новый способ сохранения

если читать по байту то есть вероятность что потом будет слишком долго переводить из одного формата в другой.
Я проверил, теперь если тип задавать в ручную при помощи bundle-чтение файла будет корректным. Осталось разобраться как по строке типа U32,U32,U32,I32,U16 сгенерировать нужный мне тип используя bundle
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

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

Postby dadreamer on 06 Jun 2016, 18:38

XAPOH wrote:если читать по байту то есть вероятность что потом будет слишком долго переводить из одного формата в другой.

Так никто ж не мешает проверить... :wink: Тем более что именно такая операция (преобразование типов) выполняется при чтении файла, т.к. изначально файл читается как набор байт функциями ОС, а уже потом :labview: его интерпретирует.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby XAPOH on 06 Jun 2016, 18:46

К сожалению компилятор отказывается понимать такой код:
Read_File4.jpg

если развернуть цикл в ручную на 5 бандлов-то все будет работать:
Read_File5.jpg
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

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

Postby XAPOH on 06 Jun 2016, 18:54

такая операция (преобразование типов) выполняется при чтении файла

я всегда думал весь файл читается в оперативную память без изменений,в один буфер. А потом на начало буфера ставится указатель. И весь фокус в том что тип указателя совпадает с внутренней структурой файла. В этом случае никаких преобразований не происходит, только обращение по адресам в оперативной памяти. А там данные (если все правильно сделано) оказываются совпадающими по типу...
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

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

Postby dadreamer on 06 Jun 2016, 19:06

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

Это бы вы в текстовом языке так делали, потому что так естественно делать. А :labview: будет разбирать файл "по винтикам", ибо типы данных :labview: отличны от стандартных и не обязаны совпадать с ними (и часто не совпадают). К тому же копия этих данных нужна непосредственно на БД для формирования контролов/индикаторов заданного типа.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby XAPOH on 06 Jun 2016, 19:09

Ага. Понял. Я кажется сообразил как правильно теперь задать вопрос!
Возможно ли динамическое создание типа в :labview:? И если возможно то как?
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

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

Postby dadreamer on 06 Jun 2016, 19:14

XAPOH wrote:Возможно ли динамическое создание типа в лаб вью. И если возможно то как?

То есть, чтобы в ран-тайме тип менялся: например, был кластер из чисел, потом стал кластер из строк, потом из массивов и т.п.?
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby XAPOH on 06 Jun 2016, 19:18

Не, чтобы был кластер из 2 Unsigned Int32, а потом стал кластер из 2 Unsigned Int32, N Int32 и K Unsigned Int16. В рантайме. А K и N брались из текстового файла
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

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

Postby dadreamer on 06 Jun 2016, 20:26

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

Кластеры нельзя использовать как динамический тип, т.к. это структура / запись (typedef struct), она генерируется на этапе программирования. Из широко известных динамических типов - строки и массивы. То есть, читаете как массив - переводите в нужный тип. Также со строкой. К вашим услугам волшебные инструменты Type Cast и Flatten To String / Unflatten From String.
User avatar
dadreamer
professor
professor
 
Posts: 3062
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2018
Karma: 765
I/O VIP vision internet

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

Postby XAPOH on 06 Jun 2016, 22:45

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

Но этот тип нельзя объявить динамически, а я заранее не знаю структуру файла который мне отдадут.
User avatar
XAPOH
beginner
beginner
 
Posts: 28
Joined: 20 Oct 2010, 15:18
LabVIEW Version: 8.6; 2013
Karma: 5

Next

Return to Сохранение данных

Who is online

Users browsing this forum: No registered users and 3 guests

cron