我需要读取 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
最佳答案
您正在将 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
在这里,我有 pre-allocated first_chip
和 info
数组。如果不这样做,每次添加元素时都会重新分配数组,从而导致昂贵的副本。我也先提取了投资返回率,然后转换为双倍,as suggested by Rahul in his answer .最后,我重新使用 DICOM 信息结构来读取文件。我不知道这是否会对速度产生很大影响,但它 saves the dicomread
function some effort .
但请注意,此过程仍需要相当长的时间。读取 DICOM 文件很复杂,而且需要时间。我建议您一次性全部读完,然后将 first_chip
和 info
元胞数组保存到 MAT 文件中,这样以后读起来会快很多.
关于matlab - 将 DICOM 数据读入元胞数组的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50341776/