我需要阅读4000个或更多DICOM文件。我编写了以下代码来读取文件并将数据存储到单元格数组中,以便稍后处理它们。单个DICOM文件包含128 * 931数据。但是一旦我执行代码,完成迭代需要超过55分钟。有人可以向我指出以下代码的性能问题吗?
% read the file information form the disk to memory
readFile=dir('d:\images','*.dcm');
for i=1:4000
% Read the information form the dicom files in to arrays
data{i}=dicomread(readFile(i).name);
info{i}=dicominfo(readFile(i).name);
data_double{i}=double(data{1,i}); % convert 16 bit data into double
first_chip{i}=data_double{1,i}(1:129,1:129); % extracting first chip data into an array
end
答案 0 :(得分:3)
您可以运行 profiler 来检查代码的哪一部分占用大部分时间!但就我看来,它是你的迭代大小&所花的时间非常真实。如果你有一个多核处理器,你可以尝试使用并行计算( parfor 循环),这应该根据你拥有的核心数量显着减少运行时间。
一个建议是首先将“第一个芯片数据”提取出来,然后将其转换为加倍,因为转换过程需要很长时间。
答案 1 :(得分:3)
您正在将128 * 931 * 4000像素读入内存(假设16位值,即接近1 GB),将其转换为双倍(4 GB)并提取区域(129 * 129 * 4000 * 8 = 0.5 GB) )。你保留所有这三个副本,这是一个可怕的数据量!尽量不要保留所有数据:
readFile = dir('d:\images','*.dcm');
first_chip = cell(size(readFile));
info = cell(size(readFile));
for ii = 1:numel(readFile)
info{ii} = dicominfo(readFile(ii).name);
data = dicomread(info{ii});
data = (1:129,1:129); % extracting first chip data
first_chip{ii} = double(data); % convert 16 bit data into double
end
在这里,我有first_chip
和info
数组pre-allocated。如果不这样做,每次添加元素时都会重新分配数组,从而导致代价高昂的副本。我还首先提取了ROI,然后转换为双倍as suggested by Rahul in his answer。最后,我重新使用DICOM信息结构来读取文件。我不知道这是否会对速度产生很大影响,但saves the dicomread
function some effort。
但请注意,此过程仍需要相当长的时间。读取DICOM文件很复杂,需要时间。我建议你一次性阅读它们,然后将first_chip
和info
单元格数组保存到一个MAT文件中,以后读取的速度会快很多。