parfor 루프에서 변수 저장하기
R2026b이 예제에서는 parfor 루프에서 save 함수를 사용하여 하나 이상의 변수를 파일에 저장하는 방법을 보여줍니다.
parfor 루프의 본문에서 save 함수를 사용하려면 "-fromstruct" 옵션을 사용해야 합니다. 이 옵션을 사용하지 않는 경우 MATLAB®은 투명성 위반으로 인한 오류를 생성합니다.
또한 각 워커 또는 parfor 반복이 데이터를 쓰거나 저장하는 파일에 고유한 액세스를 갖도록 해야 합니다. 여러 워커가 동일한 파일에 쓰려고 하면 MATLAB에서 오류가 발생하거나 데이터가 손상될 수 있으며, 한 워커가 다른 워커의 데이터를 덮어쓸 수도 있습니다. 이러한 문제는 다음과 같은 경우 발생할 가능성이 더 높습니다.
컴퓨터당 워커가 두 개 이상 있고, 이들 워커가 동일한 파일에 쓰려고 하는 경우.
워커들이 공유 파일 시스템을 사용하고 있고, 파일에 쓰기 위해 동일한 경로를 사용하여 파일을 식별하는 경우.
프로세스 워커로 구성된 병렬 풀을 시작합니다.
pool = parpool("Processes");Starting parallel pool (parpool) using the 'Processes' profile ... Connected to parallel pool with 6 workers.
parfor 루프를 사용하여 데이터를 생성하고 각 반복에서 별도의 MAT 파일에 저장합니다. 결과 변수를 스칼라 구조체에 임시로 저장합니다. save 함수의 "-fromstruct" 옵션을 사용하여 구조체의 필드와 값을 파일에 변수로 저장합니다.
parfor idx = 1:pool.NumWorkers x = rand(1000*idx); s = struct("x",x); save(sprintf("output_%d.mat",idx),"-fromstruct",s); end
기본적으로 parpool은 워커의 작업 폴더를 MATLAB 클라이언트 세션의 작업 폴더와 일치하도록 설정합니다. 따라서, 클라이언트의 현재 작업 폴더가 워커가 파일을 저장하는 디폴트 폴더가 됩니다.
whos 함수를 사용하여 파일 중 하나의 내용을 표시합니다.
whos("-file","output_1.mat");
Name Size Bytes Class Attributes x 1000x1000 8000000 double
여러 변수를 저장하려면 여러 개의 필드를 가진 구조체를 만든 다음, 해당 필드와 값을 개별 변수로 저장합니다.
parfor idx = 1:pool.NumWorkers x = rand(1000*idx); y = eye(idx); z = magic(idx); s = struct("x",x,"y",y,"z",z); save(sprintf("output_%d.mat",idx),"-fromstruct",s); end
파일 중 하나의 내용을 표시합니다.
whos("-file","output_2.mat");
Name Size Bytes Class Attributes x 2000x2000 32000000 double y 2x2 32 double z 2x2 32 double
파일을 삭제하고 병렬 풀을 종료합니다.
delete output*
delete(pool);Parallel pool using the 'Processes' profile is shutting down.