如何在Matlab中更快地读取大量TIFF文件?
我必须读入数百个TIFF文件,执行一些数学运算,并输出一些东西。这是为数千个实例所做的。最大的瓶颈是imread。使用PixelRegion,我只读取文件的一部分,但速度仍然很慢 目前,阅读部分在这里 你能建议我怎样加快速度吗如何在Matlab中更快地读取大量TIFF文件?,matlab,tiff,imread,Matlab,Tiff,Imread,我必须读入数百个TIFF文件,执行一些数学运算,并输出一些东西。这是为数千个实例所做的。最大的瓶颈是imread。使用PixelRegion,我只读取文件的一部分,但速度仍然很慢 目前,阅读部分在这里 你能建议我怎样加快速度吗 for m = 1:length(pfile) if ~exist(pfile{m}, 'file') continue; end pConus = imread(pfile{m}, 'PixelRegion',{[min(r1),
for m = 1:length(pfile)
if ~exist(pfile{m}, 'file')
continue;
end
pConus = imread(pfile{m}, 'PixelRegion',{[min(r1),max(r1)],[min(c1),max(c1)]});
pEvent(:,m) = pConus(tselect);
end
一般加速比
- 像素区域似乎不会在每次迭代时改变。我不完全确定Matlab是否会优化min和max调用(尽管我很确定它不会)。如果在每次迭代中都不更改它们,请将它们移到for循环之外并计算一次
帕弗 以下解决方案假定您可以访问并行计算工具箱。我测试了10840个TIFF,每个图像最初是1000x1000,但我只读取了其中的300x300部分。我不确定有多少个大的
pconu(tselect)
,所以我只存储了整个300x300图像
另外,很抱歉格式化了。它拒绝将其格式化为代码块
基于我的2.3 GHz i7 w/16GB内存的结果
- 适用时间:130秒
- parfor:26s+开始游泳池的时间
clear;clc;
n = 12000;
% Would be faster to preallocate this, but negligeble compared to the
% time it takes imread to complete.
fileNames = {};
for i = 1:n
name = sprintf('in_%i.tiff', i);
% I do the exist check here, assuming that the file won't be touched in
% until the program advances a files lines.
if exist(name, 'file')
fileNames{end+1} = name;
end
end
rows = [200, 499];
cols = [200, 499];
pics = cell(1, length(fileNames));
tic;
parfor i = 1:length(fileNames)
% I don't know why using the temp variable is faster, but it is
temp = imread(fileNames{i}, 'PixelRegion', {rows, cols});
pics{i} = temp;
end
toc;
一般加速比
- 像素区域似乎不会在每次迭代时改变。我不完全确定Matlab是否会优化min和max调用(尽管我很确定它不会)。如果在每次迭代中都不更改它们,请将它们移到for循环之外并计算一次
帕弗 以下解决方案假定您可以访问并行计算工具箱。我测试了10840个TIFF,每个图像最初是1000x1000,但我只读取了其中的300x300部分。我不确定有多少个大的
pconu(tselect)
,所以我只存储了整个300x300图像
另外,很抱歉格式化了。它拒绝将其格式化为代码块
基于我的2.3 GHz i7 w/16GB内存的结果
- 适用时间:130秒
- parfor:26s+开始游泳池的时间
clear;clc;
n = 12000;
% Would be faster to preallocate this, but negligeble compared to the
% time it takes imread to complete.
fileNames = {};
for i = 1:n
name = sprintf('in_%i.tiff', i);
% I do the exist check here, assuming that the file won't be touched in
% until the program advances a files lines.
if exist(name, 'file')
fileNames{end+1} = name;
end
end
rows = [200, 499];
cols = [200, 499];
pics = cell(1, length(fileNames));
tic;
parfor i = 1:length(fileNames)
% I don't know why using the temp variable is faster, but it is
temp = imread(fileNames{i}, 'PixelRegion', {rows, cols});
pics{i} = temp;
end
toc;
从这个例子很难说如何帮助。但是,我的第一个问题是,在执行此循环之前,您是否将
pEvent
初始化为正确的大小。如果不是这样,那么在大量迭代之后,分配可能会变得非常缓慢。我不知道如何加快阅读速度。@AeroEngy是的,事实上我知道。谢谢它们是什么类型的图像(例如16 bpp扁平压缩)?你必须在matlab中这样做吗?速度比编程环境更重要吗?从这个例子很难说如何帮助。但是,我的第一个问题是,在执行此循环之前,您是否将pEvent
初始化为正确的大小。如果不是这样,那么在大量迭代之后,分配可能会变得非常缓慢。我不知道如何加快阅读速度。@AeroEngy是的,事实上我知道。谢谢它们是什么类型的图像(例如16 bpp扁平压缩)?你必须在matlab中这样做吗?速度比编程环境更重要吗?谢谢。一个简短的问题。既然这整件事必须一次又一次地做,那么游泳池是否每次都必须启动?或者它是一次性的吗?每次打开MATLAB时只需启动该池(除非它进入睡眠状态)。但这基本上是一次性的,然后您可以在不重新启动池的情况下运行任意次数的代码。此外,我建议您打开活动监视器/任务管理器等,查看您的cpu使用情况。如果默认的Matlab池配置没有使您的cpu饱和,那么您可以手动增加工作线程的数量。谢谢。一个简短的问题。既然这整件事必须一次又一次地做,那么游泳池是否每次都必须启动?或者它是一次性的吗?每次打开MATLAB时只需启动该池(除非它进入睡眠状态)。但这基本上是一次性的,然后您可以在不重新启动池的情况下运行任意次数的代码。此外,我建议您打开活动监视器/任务管理器等,查看您的cpu使用情况。如果默认的Matlab池配置没有使cpu饱和,则可以手动增加工作线程的数量。