我正在编写一个MATLAB程序,它将生成一个包含100万行和未知列数(最多100万)的矩阵。
我尝试预先分配这个矩阵:
a=zeros(1000000,1000000)
但我收到了错误:
“超出了程序允许的最大变量大小。”
我觉得不预先分配这个矩阵会严重降低代码的速度。
这让我很好奇:MATLAB中的最大数组大小是多少?
更新:我将研究稀疏矩阵,因为我在这个特定问题中的目标是一个由大部分零组成的矩阵。
答案 0 :(得分:8)
看一下这个页面,它列出了最大尺寸:Max sizes
看起来大约有几亿。请注意,您在此处尝试创建的矩阵是:10e6 * 10e6 = 10e12个元素。这比提供的最大尺寸大许多个数量级,并且您的系统上也没有那么多RAM。
我的建议是针对您要完成的任务来研究不同的算法。
答案 1 :(得分:6)
要查找实际最大数组大小(仅限Windows),请使用命令user = memory。 user.maxPossibleArrayBytes显示连续RAM的空闲字节数。除以数组中每个元素的字节数(双精度数为8),您就知道可以预分配的最大元素数。
请注意,正如woodchips所述,Matlab可能必须复制您的数组(例如,如果您将值传递给子函数)。根据我的经验,75%的最大可能阵列通常可以多次使用。
答案 2 :(得分:2)
有两个不同的限制需要注意:
第一个限制是导致程序允许的最大变量大小" ,而不是第二个限制。然而,第二个也是你必须意识到的实际限制!
检查数组允许的最大元素数,如下所示:
>> [~,maxsize] = computer
maxsize =
2.8147e+14
根据documentation for the computer
command,返回:
此版本MATLAB中矩阵中允许的最大元素数
这是元素数量的静态MATLAB限制,不受计算机状态(硬件规格和当前内存使用情况)的影响。对于那个长度的double
数组,超过2 petabytes ,它也比我所知道的任何计算机都要高!
另一方面,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;
以编程方式访问这些值。
第一个限制(硬限制)已经修复到R2015a,现在可以通过以下设置更改(但只减少到系统内存的一小部分):
您无法将其增加到超出系统限制范围。
第二个限制显然没有"设置"在MATLAB中,因为它基于可用的内存和计算机配置。除了添加RAM之外,你可以做的事情并不多:(1)pack
来整合工作区内存并执行"垃圾收集",但这可能只对某些平台有帮助, (2)增加页面文件大小以允许其他东西换出并为MATLAB提供更多的物理内存。但是在依赖您的页面文件时要小心,因为如果发生page file thrashing,您的计算机可能会无响应。
答案 3 :(得分:0)
在不包含memory命令的旧版Matlab中,您可以使用:
功能memstats
Physical Memory (RAM):
In Use: 738 MB (2e2c3000)
Free: 273 MB (11102000)
Total: 1011 MB (3f3c5000)
Page File (Swap space):
In Use: 1321 MB (529a4000)
Free: 1105 MB (45169000)
Total: 2427 MB (97b0d000)
Virtual Memory (Address Space):
In Use: 887 MB (37723000)
Free: 1160 MB (488bd000)
Total: 2047 MB (7ffe0000)
Largest Contiguous Free Blocks:
1. [at 4986b000] 197 MB ( c585000)
2. [at 3e1b9000] 178 MB ( b2a7000)
3. [at 1f5a0000] 104 MB ( 6800000)
4. [at 56032000] 77 MB ( 4d3e000)
5. [at 68b40000] 70 MB ( 4660000)
6. [at 3a320000] 54 MB ( 3610000)
7. [at 63568000] 45 MB ( 2d48000)
8. [at 35aff000] 40 MB ( 2821000)
9. [at 60f86000] 37 MB ( 25ca000)
10. [at 6f49d000] 37 MB ( 25b3000)
======= ==========
842 MB (34ac0000)
ans =
207114240
你无法抑制输出,但它会返回可用的最大内存块(207,114,240 Bytes / 8 = 25,889,280 double)