Как оптимальным образом прочитать текстовый файл?

Работа с файлами и базами данных
Ответить
Lancelot

Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

Добрый день!
Предыстория: необходимо склеить несколько файлов (размером под 100мб, кол-во строк несколько миллионов ) в один, где каждому столбцу будет соответствовать файл. Во время чтения данных также необходимо производить обработку данных, в результате которой объем данных из файлов увеличивается еще сильнее (процедура ресемплирования)

Вопрос: как оптимальным образом реализовать считывание данных, чтобы весь процесс обработки занимал как можно меньшее время и использовал достаточно ограниченные ресурсы памяти?

пы.сы. текстовый файл - вынужденная мера, в дальнейшем будут использоваться бинарные
Спасибо.
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Eugen Graf »

Привет! Это зависит от вида обработки данных.
Такой вариант:
открываешь все файлы и в цикле считываешь из каждого допустим 10 строк (Read Text File имеет такую опцию, где задаёшь количество строк для чтения), высчитываешь среднее арифметическое (или что там тебе нужно) склеиваешь в одну строку и записываешь её в другой файл.
Lancelot

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

Ну то, что читать по кускам это понятно)))) Обработка заключается в приведении данных к единому времени (для этого и используется ресемплирование и интерполяция)
Да, считывание всех файлов в одном цикле не могу реализовать, т.к. первая строка первого файла не соответствует первой строке второго файла и тд. Таким образом мне необходимо начала найти в файлах общую точку, а затем уже их склеивать. В параллельных циклах я это реализовал. только вот долго это все работает
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Eugen Graf »

Так ты делаешь моё актуальное задание :-) Только у меня файлы два текстовых и один бинарный помноженное на три источника (итого 9 файлов) с разными частотами. Нужно делать то же самое - привести все файлы к общему времени и общей заданной частоте с помощью интерполяции.
Да, сначала ищешь общую точку времени и запоминаешь её. Потом создаёшь свой интервал (растр) времени, к которому ты будешь интерполировать. Ну и далее из каждого файла считываешь куски (размеры кусков зависят от частоты) и интерполируешь.
Lancelot

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

не, у меня попроще))) Частота 4 Гц, но период опроса на датчиках немного плавает (микросекунды). Нет общего синхросигнала, поэтому приходится сводить все данные к единой шкале (интерполяция при таких частотах вполне себе допустима). Я беру одну шкалу времени, а остальные разбиваю, чтобы стало 10 отсчетов на 1мс (при том, что точность сведения равна 1мс), ну и далее уже склеиваю.

Можно поподробнее о поиске начального времени? Сейчас я читаю файл (упорядочивание по имени позволяет выбрать самый поздний - а значит и опорный - файл и найти начальную точку для всех файлов), ищу самое маленькое время конца записи и по нему обрезаю остальные, а далее идет сведение. чтение на данный момент идет не кусками, что очень меня огорчает))
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Eugen Graf »

Примерно так: считываешь из всех файлов первую строку (начальное время) и последнюю строку (конечное время). Из первого находишь максимум из последнего минимум. Это твой общий промежуток времени (остальное "обрезается"). Его разбиваешь на временной растр с заданной частотой. И к этому растру интерполируешь все файлы, по кусочкам.
Lancelot

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

а тут возникает неожиданный для самого себя вопрос: как по-быстрому считать последнюю запись?)))
Аватара пользователя
Eugen Graf

Activity Professionalism Silver Black
guru
guru
Сообщения: 6502
Зарегистрирован: 13 ноя 2007, 02:20
Награды: 4
Версия LabVIEW: 2009
Откуда: Saarbrücken
Контактная информация:

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Eugen Graf »

Угу, интересный вопрос. Просто переставляешь File Position на какое то количество байт (больше длины одной строки) с конца и пытаешься считать одну строку и преобразовать данные. Если ошибки не выскакивает, то вот и она, последняя строка.
Lancelot

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

гыгыгы, я думал что это достаточно извращенный метод, ан нет))) завтра буду пробовать, спасибо
Аватара пользователя
Jakob Brontfeyn

Activity Gold Silver Black
expert
expert
Сообщения: 1729
Зарегистрирован: 28 фев 2008, 11:01
Награды: 6
Благодарил (а): 1 раз
Контактная информация:

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Jakob Brontfeyn »

рекомендую ознакомиться с темой

http://labviewportal.org/viewtopic.php?f=142&t=2761
Lancelot

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

в общем решил я свою задачу для случая с двумя файлами, все работает нормально. Но когда взялся за масштабирование, чтобы с различным числом файлов работать, наткнулся на проблему:
я данные, считанные из файла, передаю в очередь (для каждого файла своя очередь) и обрабатываю их в параллельном цикле. В итоге ссылка на первую очередь почему-то получается битая.
Есть мнение, что такое получается из-за одновременного обращения на запись и чтение элемента очереди. Так ли это и если так, то как такого можно избежать?
Аватара пользователя
IvanLis

Activity Professionalism Tutorials Gold Man of the year 2012
Автор
guru
guru
Сообщения: 5463
Зарегистрирован: 02 дек 2009, 17:44
Награды: 7
Версия LabVIEW: 2015, 2016
Откуда: СССР
Благодарил (а): 28 раз
Поблагодарили: 87 раз

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение IvanLis »

Lancelot писал(а):Есть мнение, что такое получается из-за одновременного обращения на запись и чтение элемента очереди. Так ли это и если так, то как такого можно избежать?
А наименование "очереди" не повторяется случайно?
Или может Вы уничтожаете ее раньше времени?

Должна же какая-то ошибка выдаваться... на что ругается?
Lancelot

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

этого точно не происходит. Имя очереди формируется автоматически: file i
уничтожение происходит гораздо позже. Причем при проверке на двух файлах первый элемент - not refnum, зато второй file 2 как и положено (в первом случае извлекаю 0 элемент массива, во втором - первый)
Lancelot

Re: Как оптимальным образом прочитать текстовый файл?

Сообщение Lancelot »

Дело было не в бабине... осторожнее используйте Array AND, он возвращает истину не только когда все значения равны 1, но и когда массив значений пустой. На этом то я и накололся) Очереди закрывались, а я не понимал почему
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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