为什么 Matlab 在迭代次数较慢的循环中速度较慢,但迭代次数很少,速度很快



我正在运行一个函数,从 100,000+ 患者 xray dicom 文件中提取一些信息。 这些文件存储在Veracrypt加密容器中,以确保安全。

当我在一小部分文件样本上运行该函数时,

它的执行速度非常快,但是当我在整个数据集上运行该函数时,相比之下它非常慢,从每秒几个文件增加到每秒 1 个文件(大约)。

我在徘徊,为什么会这样? 我尝试将数据存储在SSD和普通硬盘驱动器上,与使用较小的数据集相比,使用较大的数据集时速度相同。

我已经添加了下面的代码以供参考,但还没有完全注释它..这是为了我的论文,所以我会在提取完成后做。.

感谢您的任何帮助。

function [ DB, corrupted_files ] = extract_from_dcm( folder_name )
%EXTRACT_FROM_DCM Summary of this function goes here
%   Detailed explanation goes here
if nargin == 0
    folder_name = 'I:Find and TreatMXU Old Backup2005';
end
Database_Check = strcat(folder_name, 'DataBase.mat');
if exist(Database_Check, 'file')
    load(Database_Check);
    entry_start = length(DB) + 1;
else
    entry_start = 1;
    [ found_dicoms ] = recursive_search( folder_name );
end
mat_file_location = strcat(folder_name, 'DataBase.mat');
excel_DB_file = strcat(folder_name, 'DataBase.xlsx');
excel_Corrupted_file = strcat(folder_name, 'Corrupted_Files.xlsx');
% the recursive search creates a struct with the path for each
% dcm file found. the list is then recursivly used to locate
% the image and extract the relevant information from it.

fprintf('---------------------------------------------n');
fprintf('Start Patient Data Extractionn');
tic
h = waitbar(0,'','Name','Patient Data Extraction');
entry_end = length(found_dicoms);
if entry_end == 0
    %     set(handles.info_box, 'String', 'No Dicom Files Found in this Folder or its Subfolders');
else
    %     set(handles.info_box, 'String', 'Congratulations Dicom Files have been found Look Through the Data Base using the Buttons Below....Press Save Button to save the Database. (Database Save format is EXCEL SpreadSheet and MAT file');
    for  kk = entry_start : entry_end
        progress = kk/entry_end;
        progress_percent = round(progress * 100);
        waitbar(progress,h, sprintf('%d%%   %d/%d of images processed', progress_percent, kk, entry_end));
        img_full_path = found_dicoms(kk).name;
        %         search_path = folder_name;
        %         img_full_path = strrep(img_full_path, search_path, '');
        try              %# Attempt to perform some computation
            dicom_info = dicominfo(img_full_path); %# The operation you are trying to perform goes here
            try              %# Attempt to perform some computation
                dicom_read = dicomread(dicom_info); %# The operation you are trying to perform goes here
                old = dicominfo(img_full_path);
                DB(kk).StudyDate = old.StudyDate;
                DB(kk).StudyTime = old.StudyTime;

                if isfield(old.PatientName, 'FamilyName')
                    DB(kk).Forename = old.PatientName.FamilyName;
                else
                    DB(kk).Forename = 'NA';
                end
                if isfield(old.PatientName, 'GivenName')
                    DB(kk).LastName = old.PatientName.GivenName;
                else
                    DB(kk).LastName = 'NA';
                end
                if isfield(old, 'PatientSex')
                    DB(kk).PatientSex = old.PatientSex;
                else
                    DB(kk).PatientSex = 'NA';
                end
                if isempty(old.PatientBirthDate)
                    DB(kk).PatientBirthDate = '00000000';
                else
                    DB(kk).PatientBirthDate = old.PatientBirthDate;
                end
                if strcmp(old.Manufacturer, 'Philips Medical Systems')
                    DB(kk).Van = '1';
                else
                    DB(kk).Van = '0';% section to represent organising by different vans
                end
                DB(kk).img_Path = img_full_path;
                save(mat_file_location,'DB','found_dicoms');
            catch exception  %# Catch the exception
                fprintf('read - file %d corrupt.n',kk);
                continue       %# Pass control to the next loop iteration
            end

        catch exception  %# Catch the exception
            fprintf('info - file %d corrupt.n',kk);
            continue       %# Pass control to the next loop iteration
        end

    end
end

[ corrupted_files, DB ] = corruption_check( DB, found_dicoms, folder_name );

toc
fprintf('End Patient Data Extractionn');
fprintf('---------------------------------------------n');
fprintf('---------------------------------------------n');
fprintf('Start Saving Extracted Data n');
tic

save(mat_file_location,'DB','corrupted_files','found_dicoms');
if isempty(DB)
    msg = sprintf('No Dicom Files Found');
    msgbox(strcat(msg));
else
    DB_table = struct2table(DB);
    writetable(DB_table, excel_DB_file);
end
close(h);
toc
fprintf('End Saving Extracted Data n');
fprintf('---------------------------------------------n');
end
好的,

谢谢所有的帮助。

我的问题是每次迭代结束时的保存,但最大的问题是我运行dicomread函数的行。 我将保存更改为每处理 20 张图像。

我还删除了评论中建议的预分配,看看它在没有二分法和节省膨胀的情况下有什么不同。 它比预分配慢得多。

。我只需要找到DiComread的解决方案(我用它来检查文件是否损坏)。

相关内容

  • 没有找到相关文章

最新更新