Чтение временных рядов изображений NII замедляется
Я занимаюсь разработкой программы для чтения временных рядов изображений в формате NIfTY в матрицу 4D в MATLAB. В стеке около 60 изображений, и программа работает без проблем до 28-го изображения. (Все изображения примерно одинакового размера, одинаковые детали) Но после этого чтение становится все медленнее и медленнее.
На самом деле задержка накапливается. Я снова проверил программу и нет открытых файлов. Все выглядит хорошо.
Может кто-нибудь дать мне совет?
1 ответ
Размер текущего массива (двойной)
Если вы не работаете на машине с более чем 20 ГБ ОЗУ, ваша матрица просто станет слишком большой для обработки.
Чтобы проверить размер первых трех измерений вашей матрицы:
A = rand(512,512,160);
whos('A')
Выход:
Name Size Bytes Class Attributes
A 512x512x160 335544320 double
Теперь умножьте на 60, чтобы получить размер вашей 4D матрицы, и разделите на 1024^3, чтобы получить ГБ:
335544320*60/1024^3 = 18.7500 GB
Так что да, ваша матрица, скорее всего, слишком велика для того, чтобы обрабатывать ее эффективно / эффективно.
Матрица, превышающая вашу оперативную память, заставляет MatLab использовать файл подкачки (HDD/SSD), который на несколько порядков медленнее, чем ваша оперативная память (даже если у вас есть SSD).
Переключиться на разные типы данных
Если вам не требуется двойная точность, то есть 16 цифр точности, вы всегда можете переключиться на меньшее количество цифр, то есть числа с плавающей запятой одинарной точности. Делая это, вы можете уменьшить размер. Вы можете даже уменьшить размер, если числа являются, например, целыми числами без знака в диапазоне 0-255. Смотрите код ниже:
% Create doubles
A_double = rand(512,512,160);
S1=whos('A_double');
% Create floats
A_float = single(A_double);
S2=whos('A_float');
% Create unsigned int range 0-255
A_uint=uint8(randi(256,[512,512,160])-1);
S3=whos('A_uint');
fprintf('Size A_double is %4.2f GB\n',(S1.bytes*60)/1024^3)
fprintf('Size A_float is %4.2f GB\n',(S2.bytes*60)/1024^3)
fprintf('Size A_uint is %4.2f GB\n',(S3.bytes*60)/1024^3)
Выход:
Size A_double is 18.75 GB
Size A_float is 9.38 GB
Size A_uint is 2.34 GB
Который может просто поместиться в вашей оперативной памяти. Убедитесь, что вы действительно предварительно выделяете память, т.е. создаете пустую матрицу, используя функцию нулей ().