Matlab — Повышение эффективности метода чтения файлов

Я пишу сценарий Matlab, который начинается с чтения файла .log с разделителями-пробелами в массив ячеек. Все заголовки столбцов в файле представляют собой строки, но типы данных в файле смешанные, поэтому для простоты я пока рассматриваю каждое значение как строку.

Это то, что у меня есть до сих пор, и оно отлично работает с небольшими файлами.

fileID = fopen('file');
ImportData = char.empty; % create empty array to add on to

while ~feof(fileID)
    tLines = fgetl(fileID); % reads line into string
    raw = strsplit(tLines, ' '); %splits line into array for that line
    ImportData = cat(1, ImportData, raw); %adds line to rest of array
end

fclose(fileID);

Однако фактические файлы, которые этот скрипт должен будет прочитать, очень громоздки (30 000+ строк, 200+ столбцов), и я считаю, что эта процедура очень медленная для этого. Я провел некоторое исследование и уверен, что векторизация — это ответ, но я очень не знаком с этой областью.

Каким образом я могу изменить эту процедуру, чтобы резко увеличить скорость?

РЕДАКТИРОВАТЬ: типы столбцов несовместимы, поэтому функция importdata не работает. Файл имеет расширение .log, поэтому функция readtable не работает. В идеале более быстрый метод использования textscan был бы идеальным.


person BayesianRegret    schedule 29.06.2015    source источник
comment
Фиксировано ли количество столбцов?   -  person nkjt    schedule 29.06.2015
comment
В случае, если количество столбцов (и тип каждого столбца, конечно) одинаково для каждой строки, вы можете использовать любой из встроенных в Matlab функций чтения файлов. Например, importdata, xlsread или любую другую рабочую функцию. Вы также можете использовать первую строку в качестве шаблона и создать fscanf. Далее можно использовать метод textscan, где вы указываете разделитель. Трудно давать советы, не зная формата данных   -  person patrik    schedule 29.06.2015
comment
@CarlWitthoft Я думаю, что ImportData - это переменная. Предоставленный код похож на c-код. Предложение состоит в том, чтобы использовать обширные библиотеки Matlab.   -  person patrik    schedule 30.06.2015
comment
@patrik 'ImportData' здесь является переменной. Типы данных не совпадают во всем файле — некоторые столбцы являются строками, а некоторые — числовыми. Вот почему, насколько мне известно, функция importdata не будет работать. «textscan» — это то, что я использовал, но моя проблема заключается в его неэффективности для больших файлов.   -  person BayesianRegret    schedule 30.06.2015
comment
возможный дубликат самого быстрого чтения файла Matlab?   -  person rst    schedule 30.06.2015


Ответы (1)


readtable(filename,'FileType','text','Delimiter',' ')

должно работать нормально. Расширение файла «.log» не имеет значения, если ваш файл разделен символом ' '. Вы можете дополнительно указать строку/последовательность формата, если у вас есть предварительные знания о формате столбца. Указание строк формата может сделать операцию намного быстрее. Если вы не укажете формат, он вернет числовой, если весь столбец является числовым, или строки ячеек, если он смешанный.

person PHB    schedule 30.06.2015
comment
Спасибо! Это было именно то, что я искал. - person BayesianRegret; 01.07.2015
comment
Рад, что смог помочь. Не могли бы вы проголосовать за мой ответ, пожалуйста? - person PHB; 03.07.2015