Проблема с производительностью при чтении данных DICOM в массив ячеек - PullRequest
0 голосов
/ 15 мая 2018

Мне нужно прочитать 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

Ответы [ 2 ]

0 голосов
/ 16 мая 2018

Вы читаете 128 * 931 * 4000 пикселей в память (при условии 16-битных значений, это почти 1 ГБ), преобразуя это в удвоенные (4 ГБ) и выделяя область (129 * 129 *4000* 8 = 0,5 ГБ ). Вы храните все три копии, а это ужасный объем данных! Старайтесь не хранить все эти данные:

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. Если вы этого не сделаете, массивы будут перераспределяться каждый раз, когда вы добавляете элемент, что приводит к дорогостоящим копиям. Я также сначала извлек рентабельность инвестиций, а затем конвертировал в удвоение , как это было предложено Рахулом в его ответе . Наконец, я снова использую информационную структуру DICOM для чтения файла. Я не знаю, имеет ли это большое значение в скорости, но спасает dicomread функцию некоторых усилий .

Но учтите, что этот процесс все еще займет значительное время. Чтение файлов DICOM является сложным и требует времени. Я предлагаю вам прочитать их все за один раз, а затем сохранить массивы ячеек first_chip и info в файл MAT, который будет намного быстрее читать в более позднее время.

0 голосов
/ 15 мая 2018

Вы можете запустить profiler , чтобы проверить, какая часть кода занимает большую часть времени! Но, на мой взгляд, размер вашей итерации и время, затраченное на это, очень искренние. Вы можете попробовать использовать параллельные вычисления ( parfor loop), если у вас многоядерный процессор, что должно значительно уменьшить время выполнения в зависимости от количества ядер, которые у вас есть.

Одно из предложений состоит в том, чтобы сначала извлечь «данные первого чипа», а затем преобразовать их в двойные, поскольку процесс преобразования занимает значительное количество времени.

...