【问题标题】:MATLAB "out of memory" errorMATLAB“内存不足”错误
【发布时间】:2009-08-14 11:08:40
【问题描述】:

当我在 MATLAB 中运行示例脚本时,它会显示:

内存不足。键入 HELP MEMORY 作为您的选项。

当我输入“内存”时,它会报告:

Maximum possible array:             156 MB (1.638e+008 bytes) *
Memory available for all arrays:    740 MB (7.756e+008 bytes) **
Memory used by MATLAB:             1054 MB (1.105e+009 bytes)
Physical Memory (RAM):             3070 MB (3.219e+009 bytes)

*  Limited by contiguous virtual address space available.
** Limited by virtual address space available.

有什么办法可以绕过这个错误吗?我正在使用带有 MATLAB 2009a 的 Windows XP x32。

【问题讨论】:

  • 你到底在做什么?
  • 发布示例脚本(或错误的部分,如果它很长)将帮助人们更好地解决您的具体问题。

标签: matlab


【解决方案1】:

pack 进行内存碎片整理。就可用的连续内存而言,它可能会对您有所帮助。

【讨论】:

  • 感谢您的评论。赞赏!
【解决方案2】:

请记住,当 MATLAB 说它内存不足时,这意味着它的连续内存不足,因此重新启动或重新启动 MATLAB 可能会起作用。

但是,我建议优化您的代码并确定您是如何消耗如此多内存的。这可能是一个设计不当的递归循环,或者是一个糟糕的索引函数(使用双精度而不是逻辑来索引一个巨大的矩阵)。

自从我处理大量数据集以来,我几乎生活在内存错误中,但总有一种解决方法,提出具体问题,您将成为 surprised

【讨论】:

    【解决方案3】:

    问题已解决。

    在 Windows XP x32 下,我通过编辑 boot.ini 以添加开关 /3GB /USERVA=3030,几乎将 MATLAB 的可用内存量增加了一倍

    [boot loader]
    timeout=30
    default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
    [operating systems]
    multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /3GB /USERVA=3030
    

    连同减少我们的数组大小,这完全解决了问题:)

    我也可以通过升级到 Windows x64 或 Windows 7 x64 来解决此问题。即使您坚持使用 MATLAB x32 并且不升级到 MATLAB x64,此行为也会使 MATLAB 的可用内存量翻倍。 Windows x64 的内存效率要高得多,即使系统只安装了 4 GB 的物理 RAM。

    【讨论】:

    • "只有 4GB 的物理内存" -- 呵呵,都是相对的
    • 是的!当我 16 岁时,拥有一台拥有 640KByte RAM 的 XT 时,如果有人说“好吧,男孩,有一天你会发表以下评论......”,我永远不会相信。
    • Timex-Sinclair 1000 约。 1982 年有 2K 的 RAM;我们花了 40 美元买了一个插入式 16K 内存模块。我在工作中使用 dsPIC 设备,它们配备 1K 到 48K 的 RAM。 8 位 PIC 的内存更少:一些 PIC10 部件有 16 字节(不是千字节,bytes...BYTES HA HA HA)的 RAM。因此,即使在 2015 年,它仍然是相对的。 :-)
    • 如果在 32 位机器上运行 win 10(或 win xp 以外的任何系统),您可以使用以下命令达到相同的效果:BCDEdit /set increaseuserva 3072
    • “连同减少我们的数组大小,这完全解决了问题”您确定不只是减少数组大小就解决了问题吗?
    【解决方案4】:

    试试这个,它对我很有效。

    • 转到主页 -> 首选项图标 -> 常规 -> Java 堆内存 -> 分配所需大小的内存
    • 在“首选项”窗口中,转到“工作区”(超出 Java 堆内存级别)-> 参见“Matlab 数组大小限制” 确保取消选中“将最大数组大小限制为 RAM 的百分比”。因为你想扩展内存 所以我们不需要这个功能。
    • 完成。

    【讨论】:

      【解决方案5】:

      当内存不足 (OOM) 时,您试图分配什么?你有代码可以重现吗?很多问题都可能导致内存不足错误。

      要进行诊断,请使用“dbstop if all error”为错误设置断点。内存不足会触发此问题,您可以使用 dbup、dbdown 和 whos() 来查看正在消耗内存的内容。通常 OOM 是由错误的数组大小或索引计算引起的,而不仅仅是大数据结构。例如。这将在几乎任何 32 位 MATLAB 中触发 OOM。

      >> x = 1;
      >> x(2^30) = 2
      ??? Out of memory. Type HELP MEMORY for your options.
      

      【讨论】:

      • 感谢您的评论。赞赏!问题现已解决(见下文)。
      • @Gravitas:“下面”是什么?发布回复时请尽量不要依赖顺序。
      【解决方案6】:

      我在使用 mex 在 MATLAB 中运行(旧)C 文件时遇到了类似的错误。

      我在this issue on GitLab找到了我的解决方案。

      首先,取消选中 Preferences -> Workspace 下的“将最大数组大小限制为 RAM 的 %”选项,如 this earlier answer 中所示。

      应用后,在命令窗口中运行您的 C 文件

      mex filename.c -compatibleArrayDims
      

      【讨论】:

      • @CrisLuengo 是不是类似于增加Java Heap Memory 选项的属性-comptatibleArrayDims?因为,出于某种原因,该解决方案对我不起作用。 MATLAB 只是卡住并关闭了。请原谅我的无知。
      • -compatibleArrayDims 将 MEX 文件中的 mx... 函数调用更改为使用 32 位整数作为数组大小和索引,并限制最大数组大小。您链接的 GitHub 问题是由用于数组大小的 int 数组引起的,现在这是错误的类型,因为 MATLAB 需要 64 位整数。这导致 MATLAB 将该数组重新解释为一系列 64 位整数(它们不是),导致它认为用户请求了一个大得离谱的数组。 [续]
      • [cont.] 提出了两个修复:(1) 使用 mwSize 数组,根据文档,或者 (2) 使用 -compatibleArrayDims,它修改所有函数调用调用将int 作为输入而不是mwSize 的旧版本。 -compatibeArrayDims 旨在允许较新版本的 MATLAB 编译和使用旧的 MEX 文件代码,它不会增加最大数组大小(而是将其限制为 32 位整数可寻址的范围,约 2 GB)。 [续]
      • @CrisLuengo 感谢您向我指出。编辑好吗?
      猜你喜欢
      • 2011-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 2016-04-30
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多