2016-08-16 9 views
0

Я использую MATLAB для чтения пустых выходных файлов и заметил, что он читал файлы довольно медленно по сравнению с читателем, который я написал в Python для тех же файлов (на порядка 120s для MATLAB, 4s для Python в том же наборе). Файлы имеют комбинацию букв и цифр, где числа, которые я действительно хочу, имеют уникальную строку в одной строке, но в остальной части файла нет реального шаблона. Есть ли более быстрый способ читать в неравномерно форматированных текстовых файлах в MATLAB?Быстрое разделение строк в MATLAB

Я попытался использовать профилировщик кода в MATLAB, чтобы увидеть, что занимает больше всего времени, и это казалось strfind и strsplit функциями. Глубоко вниз, strfun\private\strescape кажется виновником, который занимает около 50% времени, который вызывается функцией strsplit.

В настоящее время я использую комбинацию strfind и strsplit для поиска по файлу для 5 конкретных строк, а затем конвертировать строку после нее в двойную.

lots of text before this 

    #### unique identifying text here 

lots of text before this 

sometext X = ##### 
      Y = ##### 
      Z = ##### 
more text = ###### 

Я повторяю файл с примерно следующим кодом, повторяющимся для каждого найденного числа.

fid=fopen(filename) 
tline=fgets(fid) 
while ischar(tline) 
    if ~isempty(strfind(tline('X ='))) 
     tempstring=strsplit(tline(13:length(tline)),' '); 
     result=str2double(char(tempstring(2))); 
    end 
    tline=fgets(fid); 
end 
+0

'strsplit' возвращает массив ячеек, которые также, как известно, медленны. И я считаю, что некоторые функции манипуляции строкой имеют кучу накладных расходов. Вы пытались использовать 'textscan'? Или еще лучше: ваш скрипт python? :) –

+0

Ваш способ кажется неэффективным вообще, но я не могу сделать, чтобы «сравнить» производительность без фактического файла. У вас есть копия, на которую вы можете ссылаться? –

+0

также, правильно ли я думаю, что вы в основном хотите значения X Y и Z? –

ответ

2

Я предполагаю, что это будет немного быстрее, но, возможно, не сильно.

s = fileread('texto'); 
[X,s] = strtok(strsplit(s, "X = "){2}); X = str2num(X); 
[Y,s] = strtok(strsplit(s, "Y = "){2}); Y = str2num(Y); 
[Z,s] = strtok(strsplit(s, "Z = "){2}); Z = str2num(Z); 

Очевидно, что это очень специфично для вашего текстового примера. Вы не предоставили мне больше информации о том, как переменные могут измениться и т. Д., Поэтому, вероятно, вам придется реализовать блоки try/catch, если файлы не согласованы и т.д.

PS. Это синтаксис октавы, который позволяет выполнять операции цепочки. Для Matlab разделите их на отдельные операции.

EDIT: ach, nevermind, вот и совместимый с matlab. :)

s = fileread('texto'); 
C = strsplit(s, 'X = '); [X,s] = strtok(C{2}); X = str2num(X); 
C = strsplit(s, 'Y = '); [Y,s] = strtok(C{2}); Y = str2num(Y); 
C = strsplit(s, 'Z = '); [Z,s] = strtok(C{2}); Z = str2num(Z); 
+0

Я использовал это, что хорошо сработало для случаев 'string' ####, но как вы его адаптируете к чему-то вроде ####' string'? Мне нравится, как вы читаете в файле как строку, и анализируете его один раз. – fyrepenguin

+0

Мне непонятно, что означает 'string' ####/####' string'. Приведите пример. Предпочтительно, пересматривая свой вопрос, чтобы дать конкретные примеры всех ваших возможных случаев (в противном случае все «нормально работает», нет, у меня проблема B; ok B теперь работает, я играю C », это не очень весело: /) –

+4

не говоря уже это плохой этикет, чтобы ответить «заложником» и сохранить [изменение сделки] (https://www.youtube.com/watch?v = WpE_xMRiCLE): p –

Смежные вопросы