【问题标题】:Matlab tall arrays and memoryMatlab tall 数组和内存
【发布时间】:2018-11-20 17:34:49
【问题描述】:

运行下面的代码可以重现我遇到的问题。

gcp;
C={};
for i=1:1000
    C = [C,{tall(ones(1000,1,1000,2))}];
    pause(0.05)
end

我的期望是,因为 tall 数组只是为了评估表达式而被带入内存,然后一次只有几行,所以上述不会立即导致内存问题。但是,它似乎以与调用完全相同的方式填满了我的 ram

gcp;
C={};
for i=1:1000
    C = [C,{ones(1000,1,1000,2)}];
    pause(0.05)
end

也就是说,使用 tall 数组似乎对内存使用没有任何影响。

如果我希望将 MatLab 生成的大量数据存储在内存之外,我应该怎么做?使用 tall 数组似乎不起作用。

注意:我使用的是 MatLab 2017a,它不支持 tall 数组的垂直串联。因此,我正在使用该结构

{rows1,rows2,...,rowsn}

表示同一数组的行块。这可能不是最优的。

【问题讨论】:

  • 来自docsTall 数组提供了一种处理由数据存储支持的数据的方法。如果阵列的其余部分存储在其他地方的磁盘上,则只有部分阵列被加载到内存中。否则内存是您定义这些数组的唯一位置,MATLAB 还能如何保存数组包含的内容?
  • 哦,好吧,我以为它把它放在磁盘上某个不碍事的地方,在它自己的目录之一中。所以我需要将我的每个 tall 数组存储到某个地方的磁盘上,然后内存将是空闲的 :)
  • 是的,这应该可以按您的预期工作。当然,您可以以编程方式将大型数组保存到磁盘,随时清除内存,然后将它们作为 tall 数组一起加载。
  • 我该怎么做呢?我知道我可以使用 save 或 write 将数组存储到磁盘,但是如何将它们全部加载为单个数组?
  • datastoregather。您通常创建一个datastore,然后从中创建一个tall 数组,对其执行(或者更确切地说定义)操作,然后调用gather 来实际执行计算

标签: arrays matlab memory


【解决方案1】:

正如 cmets 中提到的 - 本地 tall 数组构造函数(在其中给它提供本地数据而不是 datastore)通常仅用于内存中的原型设计,然后再将 tall 数组指向真实的datastore 中的大数据。

您可以使用tall/write 将 tall 数组写入磁盘,然后从您在write 中使用的位置进行datastore 读入。这将处理数据,而不会一次将其全部加载回内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-30
    • 2019-11-23
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2015-10-24
    • 1970-01-01
    • 2017-02-21
    相关资源
    最近更新 更多