MATLAB中的最大数组大小?
我正在编写一个MATLAB程序,该程序将生成具有100万行和未知数量列的矩阵(最大值为100万)。
我试着预先分配这个矩阵:
a=zeros(1000000,1000000)
但我收到错误:
“程序所允许的最大可变大小已超出。”
我有一种感觉,不预先分配这个矩阵会严重降低代码的速度。
这让我很好奇:MATLAB中最大的数组大小是多少?
更新:我将研究稀疏矩阵,因为我针对这个特定问题的结果将是一个包含大部分零的矩阵。
看看这个页面,它列出了最大尺寸:最大尺寸
它看起来大约是几亿美元。 请注意,您尝试在此创建的矩阵是:10e6 * 10e6 = 10e12个元素。 这比所提供的最大尺寸大很多个数量级,并且您的系统上没有那么多的RAM。
我的建议是看看你正在努力完成的一个不同的算法。
要找出真正的最大阵列大小(仅限Windows),请使用命令user = memory。 user.maxPossibleArrayBytes显示连续RAM有多少个字节是空闲的。 除以数组中每个元素的字节数(8为双精度),并且知道可以预分配的元素的最大数量。
请注意,正如木片所说,Matlab可能不得不复制你的数组(例如,如果你通过值传递给子函数)。 根据我的经验,75%的最大可能阵列通常可用多次。
限制
有两个不同的限制需要注意:
第一个限制是“超出程序允许的最大变量大小”而不是第二个限制。 然而,第二个也是你必须注意的实际限制!
检查限制
如下检查数组允许的最大元素数量:
>> [~,maxsize] = computer
maxsize =
2.8147e+14
根据computer
命令的文档,这返回:
此版本的MATLAB中矩阵中允许的最大元素数量
这是对元素数量的静态MATLAB限制 ,不受计算机状态(硬件规格和当前内存使用情况)的影响。 对于这种长度的double
数组,超过2PB,也比我知道的任何计算机都高。
另一方面,您可以在任何特定时刻创建的最大实际数组大小可以通过memory
命令进行检查:
>> memory
Maximum possible array: 35237 MB (3.695e+10 bytes) *
Memory available for all arrays: 35237 MB (3.695e+10 bytes) *
Memory used by MATLAB: 9545 MB (1.001e+10 bytes)
Physical Memory (RAM): 24574 MB (2.577e+10 bytes)
* Limited by System Memory (physical + swap file) available.
正如消息所述,这些值基于实际的当前内存可用性 ,同时考虑物理内存和交换文件(统称为虚拟内存)。
如果需要,这些值可以通过m = memory;
编程方式访问m = memory;
。
调整限制
第一个限制(硬限制)已被修复,直到R2015a,现在可以通过以下设置更改(但仅减少到系统内存的一小部分):
您无法将其增加超出系统限制。
第二个限制在MATLAB中显然没有“设置”,因为它基于可用内存和计算机配置。 除了添加RAM之外,你可以做的事情不多:(1) pack
整合工作区内存并执行“垃圾回收”,但这可能只对某些平台有所帮助,(2)增加页面文件大小以允许其他内容换掉并给MATLAB更多的物理内存。 但在依赖页面文件时要谨慎,因为如果页面文件出现抖动,您的计算机可能无响应。