Pergunta

I run a MATLAB script which generates images, saving them into a certain folder. When the code crashes, I cannot delete a few images in that folder unless I restart MATLAB.

Can I solve this problem without restart MATLAB program?

Code:

clear,clc,close all
SRC1 = 'SRC1';
SRC2 = 'SRC2';
suffix1 = '_suffix1.png';
suffix2 = '_suffix2.png';
DST = 'DST';
GT = 'GT';
FEAS = {
    SRC1;
    };
feaSuffix = {
    '_suffix.png';
    };
if ~exist(DST, 'dir')
    mkdir(DST);
end
if matlabpool('size')<=0
    matlabpool('open','local',8);
else
    disp('Already initialized');
end
files1 = dir(fullfile(SRC1, strcat('*', suffix1)));
parfor k = 1:length(files1)
    disp(k);
    name1 = files1(k).name;

    gtName = strrep(name1, suffix1, '.bmp');
    gtImg = imread(fullfile(GT, gtName));
    if ~islogical(gtImg)
        gtImg = gtImg(:,:,1) > 128;
    end
    gtArea = sum(gtImg(:));
    if gtArea == 0
        error('no ground truth in %s', gtName);
    end

    img1 = imread(fullfile(SRC1, name1));
    mae1 = CalMAE(img1, gtImg);

    name2 = strrep(name1, suffix1, suffix2);
    img2 = imread(fullfile(SRC2, name2));
    mae2 = CalMAE(img2, gtImg);

    delta = mae1 - mae2 + 1;
    preffix = sprintf('%.2f_mae1_%.2f_mae2_%.2f_', delta, mae1, mae2);

    imwrite(img1, fullfile(DST, strcat(preffix, name1)));
    imwrite(img2, fullfile(DST, strcat(preffix, name2)));
    imwrite(gtImg, fullfile(DST, strcat(preffix, gtName)));

    for n = 1:length(FEAS)
        feaImgName = strrep(name1, suffix1, feaSuffix{n});
        copyfile(fullfile(FEAS{n}, feaImgName), ...
            fullfile(DST, strcat(preffix, feaImgName)));
    end
end
Foi útil?

Solução

You can tell MATLAB to close any open files with

fclose('all');

In my experience fclose applies to all opened files, not just ones opened with fopen.

Also, since you are running a matlabpool, each worker (MATLAB.exe process) will need to release their files. To do this, I suggest creating a try-catch inside the parfor like this.

parfor k = 1:length(files1)
    try
        % your loop content here
    catch ME
        % cleanup and terminate
        fclose('all');
        rethrow(ME);
    end
end

This way, the worker that bombs out in the loop will run fclose. Running it in the master MATLAB.exe probably will not be helpful.

However, you can also make sure you close the matlabpool before you try to delete the files since this should release any file locks that the workers have.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top