Matlab — dlmread или textscan — что быстрее

У меня проблемы со временем при чтении файла ".csv" в Matlab. Используя следующую часть этого форума, я обнаружил, что количество строк составляет примерно 12 миллионов, а количество столбцов - 7.

function count = countLines(fname)
fh = fopen(fname, 'rt');
assert(fh ~= -1, 'Could not read: %s', fname);
x = onCleanup(@() fclose(fh));
count = 0;
while ~feof(fh)
count = count + sum( fread( fh, 16384, 'char' ) == char(10) );
end
end

Я попробовал команду dlmread, чтобы прочитать его в Matlab, что занимает около 120 секунд:

tic
fname='test1_csv0.csv';
N1=countLines(fname)-1; 
N2=6;
blockmodel=dlmread('test1_csv0.csv',',',[1 0 N1 N2]);
toc

Я нашел этот пост на быстром чтении Matlab

Самое быстрое чтение файла Matlab?

Но если честно, так как я не программист, я не знаю, как адаптировать код к моей задаче и что будет быстрее всего. Я хотел бы сохранить решение в Matlab, так как это единственный язык программирования, который я немного понимаю. Я был бы признателен за любую помощь, чтобы Matlab быстрее читал мою матрицу, есть ли у вас опыт, может ли «textscan» работать лучше, чем «dlmread»?


person KiW    schedule 08.06.2016    source источник
comment
dlmread в основном является оболочкой для textscan. Поэтому я не удивлюсь, если вы сможете заставить textscan работать быстрее, поскольку вы можете пропустить многие проверки, выполняемые dlmread, при условии, что вы заранее знаете свои данные. Для файлов csv также есть csvread (который также является оболочкой для textscan)   -  person Adriaan    schedule 08.06.2016
comment
не могли бы вы помочь мне настроить короткий скрипт для textscan? ... я не совсем уверен, как его использовать (объяснение математики меня немного сбивает с толку:/)   -  person KiW    schedule 08.06.2016
comment
fileID = fopen('datafile.csv'); C = textscan(fileID,'%f %f %f %f %f %f %f'); fclose(fileID); out = cell2mat(C); должно помочь. Вы также можете использовать csvread, поскольку он написан специально для CSV и фактически возвращает матрицу, поэтому вам не нужно вручную преобразовывать ее с помощью cell2mat.   -  person Adriaan    schedule 08.06.2016
comment
пытаясь запустить ваш скрипт, я просто получаю следующую ошибку: Ошибка в текстовом сканировании (строка 3) C = textscan (fileID, '%f %f %f %f %f %f %f'); есть идеи по этому поводу?   -  person KiW    schedule 08.06.2016