У меня есть следующий пример кода:
clear;
v = zeros(100, 4);
parfor i=1:100
disp(['iteration ' num2str(i)]);
v(i,:) = [i i i i+rand(1)];
temp = v(i,:);
parsave( temp )
end
и вот парсавный код, который добавляет отдельные строки матрицы v в файл test.dat:
function parsave( single_row )
dlmwrite('test.dat', single_row, '-append', 'delimiter', ',');
проблема в том, что в файле test.dat отсутствуют некоторые строки и столбцы:
...
40,40,40,40.92
6,6,66,8743
27
38,38,38,38,415
4,4,4,4.7561
...
Как видите, в третьем ряду отсутствуют три столбца.Этот вид имеет смысл в параллельной схеме.Но как это исправить?Одна идея состоит в том, чтобы разбить цикл parfor на более мелкие циклы (скажем, 5 циклов длиной 20, а не 100) и сохранить партии из 20 строк вне цикла parfor:
parfor i=1:20 %this is changed to 20 now
disp(['iteration ' num2str(i)]);
v(i,:) = [i i i i+rand(1)];
end
parsave( v(1:20,:) )
Это работает нормально, но это неоптимальное решение.Я также видел этот пост , который предполагает, что я могу сохранить каждую строку в виде отдельного файла, а затем объединить их все в один файл (что-то вроде map-Reduce).Но я уверен, что должно быть лучшее решение, учитывая, что в моем реальном коде моя матрица состоит из 60000 строк, и я не хочу, чтобы 60000 отдельных файлов сохранялись отдельно.Любое предложение приветствуется.