阅读时间序列的NII图像越来越慢

时间:2014-07-29 01:15:28

标签: matlab time-series nifty-gui

我正在开发一个程序,用于在MATLAB中将NIFTY格式图像的时间序列读取到4D矩阵。堆栈中大约有60个图像,程序运行没有问题,直到第28个图像。 (所有图像的大小大致相同,细节相同)但之后读数变得越来越慢。

事实上,延迟正在积累。 我再次检查了程序,没有打开的文件。一切都很好。

有人可以给我一个建议吗?

1 个答案:

答案 0 :(得分:2)

当前数组的大小(双倍)

除非你在内存超过20GB的机器上运行,否则你的矩阵会变得太大而无法处理。

要检查矩阵前三个维度的大小:

A = rand(512,512,160);
whos('A')

输出:

Name        Size                     Bytes      Class     Attributes

A           512x512x160              335544320  double       

现在乘以60以获得4D矩阵的大小并除以1024 ^ 3以获得GB:

335544320*60/1024^3 = 18.7500 GB

是的,您的矩阵很可能太大而无法有效/有效地处理。

超出RAM内存的矩阵强制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

这可能只适合你的RAM。确保您确实首先预先分配内存,即使用zeros()函数创建一个空矩阵。