【问题标题】:Reading time series of NII images getting slower读取 NII 图像的时间序列变慢
【发布时间】:2014-09-20 07:46:09
【问题描述】:

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

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

谁能给我一个建议?

【问题讨论】:

  • 您究竟是如何构建 4D 矩阵的?有没有可能你没有预先分配内存?你能告诉我们你的代码(它的相关部分)吗?

标签: matlab time-series nifty-gui


【解决方案1】:

当前数组的大小(双精度)

除非您在 RAM 内存超过 ~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() 函数创建一个空矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-10
    • 2020-10-30
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多