У меня проблемы со временем при чтении файла ".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»?
dlmread
в основном является оболочкой дляtextscan
. Поэтому я не удивлюсь, если вы сможете заставитьtextscan
работать быстрее, поскольку вы можете пропустить многие проверки, выполняемыеdlmread
, при условии, что вы заранее знаете свои данные. Для файлов csv также естьcsvread
(который также является оболочкой дляtextscan
) - person Adriaan   schedule 08.06.2016fileID = 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