我必须在for循环中处理一批图像(大约30000)。为此我每次执行循环都会读取一个图像。
当达到某个指数时(确切的值变化但通常在2000左右),进度会急剧减慢(因子2或3)。怎么会这样?
以下是显示此行为的最小代码示例:
imgFolder = [uigetdir, '/'];
files = dir(fullfile(imgFolder, '*.tiff'));
filenames = sort_nat({files.name});
imshow(imread([imgFolder, '/', filenames{1}]))
roi = roipoly;
meansRGB = zeros(3,length(files));
tic;
for i = 1:size(files,1)
img = imread([imgFolder, '/', filenames{i}]);
% for j=1:3
% a = regionprops(roi,img(:,:,j),'PixelValues');
% meansRGB(j,i) = mean(a.PixelValues);
% end
% show remaining time
dt = 500; % display remaining time every dt'th step
if(mod(i,dt)) == 0
disp(i)
elapsed = toc;
remainingSeconds = elapsed*(length(files)-i)/dt;
[hours, minutes, seconds] = sec2hms(remainingSeconds);
str = sprintf('remaining time: %d:%d:%d', hours, minutes, round(seconds));
disp(str);
tic;
end
end
请注意,我认为耗费时间最多的所有重要部分都已被注释掉,并不是减速循环的原因。此外还有大量的RAM和处理器周期,这应该不是问题。
答案 0 :(得分:1)
交换来实现?
可能是前几百张图片填满你的RAM吗?
对内存的任何其他访问都会触发交换和写入硬盘驱动器,这很容易减少数量级......
答案 1 :(得分:0)
imread()
是否有可能让文件句柄处于打开状态? (虽然如果是这样的话,我会感到很惊讶吗?)
您可以尝试在循环中粘贴fclose('all')
进行检查吗?