【问题标题】:My preallocation of a matrix gives out of memory error in MATLAB我的矩阵预分配在 MATLAB 中出现内存不足错误
【发布时间】:2010-10-20 21:22:05
【问题描述】:

我使用零来初始化我的矩阵,如下所示:

height  = 352
width   = 288
nFrames = 120
imgYuv=zeros([height,width,3,nFrames]);

但是,当我将 nFrames 的值设置为大于 120 时,MATLAB 会给我一条错误消息,指出内存不足。

原来的功能是

[imgYuv, S, A]= changeYuv(fileName, width, height, idxFrame, nFrames)

我的命令是

[imgYuv,S,A]=changeYuv('tilt.yuv',352,288,1:120,120);

谁能告诉我这里发生了什么?

PS:该功能的目的之一是加载包含超过 2000 帧的 yuv 视频。有没有可能实现它?

【问题讨论】:

  • heightwidth 的值是多少?
  • 你好eumiro。我刚才在我的问题中添加了值。宽度=352,高度=288。

标签: memory matlab


【解决方案1】:

有三种方法可以避免错误

  1. 处理有限数量的 任何给定时间的帧。
  2. 工作 与整数数组。大多数电影都是 8 位格式,而 Matlab 通常适用于doublesuint8 每个元素占用 1 个字节, 而double 占用 8 个字节。因此, 如果您将数组创建为B = zeros(height,width,3,nFrames,'uint8)`, 它只使用了 1/8 的内存。 这可能适用于 120 帧, 虽然对于 2000 帧,你会跑 再次陷入困境。注意不是 所有 Matlab 函数都适用于 整数数组;你可能不得不 重新实现那些需要 双倍的。
  3. 购买更多内存。

【讨论】:

    【解决方案2】:

    是的,您(或者更确切地说,您的 Matlab 会话)内存不足。

    拿出你的计算器,找到产品height x width x 3 x nFrames x 8,它会告诉你在拨打zeros时你尝试获得多少内存。这将是一个接近或超过计算机上 Matlab 可用 RAM 的数字。

    【讨论】:

    • 好吧,我明白了。但是还有其他方法可以加载文件吗?该文件由 2000 多个帧组成...有可能吗?
    【解决方案3】:

    你的命令是:

    [imgYuv,S,A]=changeYuv('tilt.yuv',352,288,1:120,120);
    

    即:

    352*288*120*120 = 1459814400
    

    即 1.4 * 10^9。如果一个对象有 4 个字节,那么您需要 6GB。这很多内存...

    【讨论】:

    • 好吧,我明白了。但是还有其他方法可以加载文件吗?该文件由 2000 多个帧组成...有可能吗?
    • 嗯,有道理。让我试试。谢谢eumiro!
    【解决方案4】:

    参考我在您撤回的帖子中看到的代码,您计算相邻帧直方图之间的差异。避免大量内存分配的一种选择可能是仅在内存中保存两个帧,而不是一次读取所有帧。

    【讨论】:

    • 是的 zellus。这正是我想要做的。谢谢你的建议。我会试试的。
    【解决方案5】:

    函数B = zeros([d1 d2 d3...]) 创建一个维度为d1*d2*d3*... 的多维数组 根据宽度和高度,给定第 3 维 3 和第 4 维 120(这实际上导致 width*height*360),可能会导致 非常 巨大的数组。每台机器都有一定的内存限制,也许你达到了这些...... ;)

    【讨论】:

    • 好吧,我明白了。但是还有其他方法可以加载文件吗?该文件由 2000 多个帧组成...有可能吗?
    • 是否有必要把完整的文件打包加载?一种解决方案可能是“流式传输”文件并一次仅加载文件的较小部分,并在下一个数据块已加载和处理(例如,显示或其他)时丢弃数据。
    • 没有必要。是的你是对的。我应该尝试每次加载一小部分。谢谢弗林施!
    猜你喜欢
    • 1970-01-01
    • 2016-01-25
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多