策略有效地使用内存
这一主题解释了在MATLAB的几个技术有效地使用内存®。
使用适当的数据存储
MATLAB为您提供不同大小的数据类,如双
和uint8
,所以你不需要使用大型类来存储您的小段的数据。例如,它需要7 KB更少的内存来存储1000小无符号整数的值使用uint8
类而不是双
。
使用适当的数值类
在MATLAB数值类应该使用取决于你的行动。默认的类双
给最好的精度,但是需要8个字节内存存储的每个元素。如果你打算执行复杂的数学线性代数等,必须使用浮点类等双
或单
。的单
类只需要4个字节。有一些限制你可以做什么单
类,但大多数MATLAB数学操作支持。金宝app
如果你只需要进行简单的算术和原始数据表示为整数,可以使用MATLAB中的整数类。下面是一个数字列表类,内存需求(以字节为单位),和支持的操作。金宝app
类(数据类型) | 字节 | 金宝app支持的操作 |
---|---|---|
单 |
4 | 大多数数学 |
双 |
8 | 所有的数学 |
逻辑 |
1 | 逻辑/条件操作 |
int8, uint8 |
1 | 算术和一些简单的功能 |
int16, uint16 |
2 | 算术和一些简单的功能 |
int32, uint32 |
4 | 算术和一些简单的功能 |
int64, int64 |
8 | 算术和一些简单的功能 |
存储数据时减少开销
MATLAB数组(内部实现mxArrays
)要求的房间在内存中存储元数据信息,如类型、维度和属性。这需要大约104字节数组。这个开销只成为一个问题,当你有大量(例如,成百上千)小mxArrays
(例如,标量)。的谁
命令列出使用的内存变量,但不包括这个开销。
因为简单的数值数组(包括1mxArray
)有最少的开销,你应该尽可能使用它们。当数据太复杂存储在一个简单的数组(矩阵),您可以使用其他数据结构。
细胞组成的数组是分开的mxArrays
为每个元素。因此,细胞阵列与许多小元素有很大的开销。
结构需要一个类似数量的每个字段(参见开销数组头)。结构与许多领域和小型内容有很大的开销,应该避免。大阵的结构与数字标量领域需要更多的内存比结构包含大量数字的字段数组。
还要注意,而MATLAB数值数组存储在连续的内存,这不是结构和细胞数组。
导入数据到适当的MATLAB类
当从二进制文件读取数据从文件中读
,这是一个常见的错误指定类中数据的文件,而不是数据的类MATLAB使用一旦在工作区中。因此,违约双
即使你只读取使用8位值。例如,
fid = fopen (large_file_of_uint8s。本”、“r”);=从文件中读(fid, 1 e3, uint8);% 8 k谁需要一个名称大小字节类属性1000 x1 = 8000双从文件中读(fid, 1 e3, uint8 = > uint8);% 1 k谁需要一个名称大小字节1000 x1 1000 uint8类属性
使尽可能稀疏阵列
如果您的数据包含了许多零,考虑使用稀疏阵列,它只存储非零元素。下面的例子比较稀疏和完整的存储需求:
一个=眼(1000);%充分稀疏矩阵的对角线为=(一个);%稀疏矩阵只有非零元素谁类属性名称大小字节1000 x1000 8000000双1000 x1000 24008双稀疏
您可以看到,这个数组需要存储为稀疏的只有4 KB,但是大约8 MB作为完整的矩阵。一般来说,对于一个稀疏阵列的两倍nnz
非零元素和ncol
列,内存要求是:
16 *
nnz
+ 8 *ncol
+ 8个字节(64位机器上)
注意,MATLAB支持大多数,但不金宝app是全部,对稀疏阵列数学操作。
避免临时副本的数据
你可以显著减少所需的内存,避免不必要的临时副本创建的数据。
避免创建临时数组
避免创建大型临时变量,也使它成为一个实践明确不再需要时临时变量。例如,这段代码创建了一个零存储为一个临时变量的数组一个
,然后将一个
单精度:
一个= 0 (1)e6, 1);=单(A);
更多的内存高效使用一个命令来做两个操作:
= 0 (1 e6, 1, '单');
使用嵌套函数通过更少的参数
在处理大型数据集时,请注意,MATLAB是一个临时复制的输入变量如果被调用的函数修改它的值。这个暂时双打所需的内存存储阵列,使MATLAB生成一个错误如果没有足够的内存可用。
在这种情况下使用更少内存的一个方法是使用嵌套函数。嵌套函数共享工作空间的外部功能,允许嵌套函数访问数据的传统范围以外。这里所示的示例中,嵌套函数setrowval
有直接访问外部函数的工作区吗myfun
,使其不必要的传递函数调用中的变量的副本。当setrowval
修改的值一个
在工作区中修改它的调用函数。不需要使用额外的内存来保存一个单独的数组的函数被调用时,也没有需要返回修改后的值一个
:
函数myfun =魔法(500);setrowval(行,函数值)(行:)=值;结束setrowval (400 0);disp('的新值(399:401 1:10)是“)(399:401 1:10)结束
回收使用的内存
一个简单的方法来增加可用的内存数量是大数组,您不再使用。
定期保存大量数据到磁盘
如果您的程序生成大量数据,考虑定期将数据写到磁盘。保存后的部分数据,使用清晰的
函数将变量从内存和继续数据生成。
当不再需要明确旧变量从内存
当你正在与一个非常大的数据集反复或交互,清除旧变量首先为新变量空间。否则,MATLAB需要临时存储之前同等大小的最重要的变量。例如,
兰德(1 = e5);b =兰德(1 e5);内存不足。更多信息,明确一个=兰德(1 e5);%新数组