如何在Matlab中更快地读取大量TIFF文件?

如何在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),

我必须读入数百个TIFF文件,执行一些数学运算,并输出一些东西。这是为数千个实例所做的。最大的瓶颈是imread。使用PixelRegion,我只读取文件的一部分,但速度仍然很慢

目前,阅读部分在这里

你能建议我怎样加快速度吗

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饱和,则可以手动增加工作线程的数量。