Итеративное добавление строк в файл внутри цикла parfor - PullRequest
0 голосов
/ 07 июня 2018

У меня есть следующий пример кода:

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 отдельных файлов сохранялись отдельно.Любое предложение приветствуется.

1 Ответ

0 голосов
/ 07 июня 2018

При записи в (двоичный) файл вы ограничены скоростью записи на жесткий диск / твердотельный накопитель, а не скоростью вашего процессора.Поэтому нет смысла выполнять эту задачу параллельно.

Кроме того, если вы попытаетесь записать что-то в один файл с помощью parfor, вы, вероятно, столкнетесь с конфликтами или условиями гонки, поскольку два или более разных процесса попытаются изменить файл одновременно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...