![]() |
1
13
这种行为不是MATLAB独有的。事实上,MATLAB无法控制它,因为它是Windows造成的。Linux和MacOS表现出相同的行为。 This excellent answer 详细解释了内存管理在大多数现代操作系统中是如何工作的(谢谢 Amro 共享链接!)。如果这个答案没有足够的细节给你看。 首先,让我们重复Ander在C语言中的实验:
上面的代码适用于与POSIX兼容的操作系统(即除Windows以外的任何操作系统),但是在Windows上可以使用
Cygwin
使(大部分)符合POSIX。你可能需要改变
VSZ列在程序启动时显示4 GiB。我不知道那是怎么回事,好像是过头了。但价值在
我说的是
现代计算机体系结构 虚拟存储器 (进程看到的内存空间)从 . 进程(即程序)使用指针访问内存,这些指针是虚拟内存中的地址。这些地址由系统转换为物理地址 使用时 关键是上面的粗体斜体文本: 使用时 . 分配给进程的内存可能不存在,直到进程尝试读取或写入它。这就是为什么在分配大数组时,RSS没有任何变化。使用的内存分配给页面中的物理内存(块通常为4kib,有时可达1mib)。因此,当我们写入新内存块的一个字节时,只分配一个页。 有些操作系统,比如Linux,甚至会“过度使用”内存。Linux将分配给进程的虚拟内存比它能够放入物理内存的容量还要多,前提是这些进程不会使用分配给它们的所有内存。 This answer 会告诉你比你想知道的还要多的过度努力。
回到MATLAB:
The preallocation advice by the MathWorks
如果我们分配一个小数组,然后想要增加它的大小,就必须分配一个新数组并复制数据。数组与RAM的关联方式对这个没有影响,MATLAB只看到虚拟内存,它没有控制权(甚至没有知识?)这些数据存储在物理内存(RAM)中的位置。从MATLAB(或任何其他程序)的角度来看,对于数组来说,最重要的是数组是一个连续的虚拟内存块。扩大现有的内存块并不总是(通常不是?)可能,因此获得一个新块并复制数据。例如,请参见 the graph in this other answer :当阵列放大时(这种情况发生在较大的垂直峰值处),将复制数据;阵列越大,需要复制的数据越多。
行为
|
![]() |
SH_IQ · 在MATLAB条形图中为特定条形图颜色添加其他图例 7 月前 |
![]() |
Vlad Vadean · Matlab数组乘法 7 月前 |
![]() |
Catalin Baba · 如何在MATLAB中连接两个向量 7 月前 |
![]() |
servoz · 在matlab和python中创建类似的矩阵对象 1 年前 |
![]() |
CircAnalyzer · MATLAB中字符串的十进制数列表 1 年前 |
![]() |
I Like Algebra · 在Julia中交换行的最简单方法 1 年前 |