【发布时间】:2013-10-28 11:11:03
【问题描述】:
我在 Matlab 中有一个大(多 GB)数组,我想截断它¹。天真地,我认为截断不需要太多内存,但后来我意识到它可能可以:
>> Z = zeros(628000000, 1, 'single');
>> Z(364000000:end) = [];
Out of memory. Type HELP MEMORY for your options.
除非 Matlab 进行一些巧妙的优化,否则在截断 Z 之前,此代码实际上创建一个数组(双精度型!)364000000:628000000。我不需要这个数组,所以我可以这样做:
>> Z = Z(1:363999999);
在这种情况下,第二个示例有效,并且适合我的目的。但是为什么它会起作用?如果Z(364000000:end) = 0 因中间数组364000000:628000000 所需的内存而失败,那么为什么Z = Z(1:363999999) 不会因为中间数组1:363999999 所需的内存而失败,即更大?当然,我需要这个中间数组,我会很高兴有一个解决方案可以截断我的数组而没有任何中间数组,或者如果 Matlab 优化了特定方法,则失败了。
- 有什么方法可以在不创建中间索引数组的情况下截断数组?
- 如果不是,上述任何一种方法是否比另一种更节省内存(似乎不是)?如果是这样,为什么? Matlab 真的在这两个例子中都创建了中间数组吗?
¹原因:我正在处理数据,但不知道要预分配多少。我做了一个有根据的猜测,我经常分配太多。我根据可用内存选择块大小,因为分成更少的块意味着更快的代码。所以我想避免任何不必要的内存使用。另见this post on allocating by chunk。
【问题讨论】:
-
这里有一些好问题。但是,可能不再需要分块分配,因为 it seems likely that MATLAB does this 已经在最近的版本中,尽管来自 MathWorks 的细节很少。
-
@chappjc 啊,有趣。我不知道这已经改变了。但是,仍然存在需要截断大数组的情况。
-
同意。当我的电脑崩溃时,我只是想用
profile('-memory','on');描述你的例子! -
在没有任何来源的情况下,我很确定 Matlab 会进行那些巧妙的优化,并且您的第二个命令不会生成中间数组。
标签: arrays matlab memory truncate