matlab - 独立 matlab 应用程序的 "Out of memory"错误 - 内存碎片

标签 matlab fragmentation out-of-memory matlab-compiler

我必须将应用程序作为独立的 Matlab 可执行文件交付给客户。该代码包括对在内部创建多个元胞数组的函数的一系列调用。

我的问题是,当对该函数的调用次数随着用户负载的增加而增加时,会发生内存不足错误。我猜这是低级内存碎片,因为工作区变量与循环数无关。

如前所述here ,退出并重新启动 Matlab 是目前此类内存不足错误的唯一解决方案。

我的问题是如何在独立应用程序中实现这种机制以保存数据、在内存不足错误的情况下退出并重新启动自身(或者以某种方式预测此类错误的可能性很高)。

是否有可用的最佳实践?

谢谢。

最佳答案

这有点难。与其重新启动以清除问题,不如更改代码以将工作分解成 block 以提高效率?碎片主要与峰值 单元格相关的内存使用量以及数据项大小的变化程度成正比,并且随着时间的推移与总使用量成正比。如果您可以将大块工作分成按顺序完成的小块,则可以降低碎片化内存使用的“高水位线”。您还可以通过使用共享其支持数据值的“flyweight”数据结构来节省内存使用量,或者有时将其转换为基于单元格的结构以引用对象或数字代码。您能否与我们分享您的代码和数据结构示例?

理论上,您可以通过将工作区和相关状态保存到 mat 文件并让可执行文件启动自身的另一个实例并选择重新加载该状态并继续,然后让原始可执行文件退出来获得一个干净的状态.但就用户体验和调试能力而言,这将非常糟糕。

另一种选择是将高碎片代码卸载到另一个工作进程中,该工作进程可以被终止并重新启动,而主可执行进程仍然存在。如果你有并行计算工具箱,它现在可以编译成独立的 Matlab 可执行文件,这将非常简单:打开一个或两个工作人员的工作池,并使用同步调用在其中运行脆弱的代码,定期杀死工作人员并培养新的。 worker 是独立的进程,它们以非碎片化的内存空间开始。如果您没有 PCT,您可以通过将您的应用程序编译为两个单独的应用程序(驱动程序应用程序和工作人员应用程序)来推出自己的应用程序,并让主应用程序启动一个工作人员并通过 IPC 控制它,来回传递您的数据作为 MAT 文件或字节流。不过,编写代码不会很有趣。

也许您还可以将一些脆弱的代码下推到 Java 层,它可以更优雅地处理类单元格数据结构。

首先将代码更改为不那么脆弱可能是更简单、更容易的方法,并且会导致应用程序设计不那么复杂。根据我的经验,这通常是可能的。如果您分享一些代码和数据结构的详细信息,也许我们可以提供帮助。

关于matlab - 独立 matlab 应用程序的 "Out of memory"错误 - 内存碎片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201005/

相关文章:

awk 关联数组增长很快

javascript - fatal error : Scavenger: semi-space copy Allocation failed

java - 从 Java 执行 Sonar 嵌入式 Runner 后无法删除 persistit_tempvol 文件

Android Activity 由于堆 fragment 导致服务崩溃

performance - 图像快速特征提取

arrays - 如何从一个数组中删除另一个数组的元素?

matlab - 使用 MATLAB 中大矩阵的特征向量获取马尔可夫链的平稳分布

algorithm - MATLAB 中 MST 的总路径长度

android - "411 Length required"- 来自使用 Android API 10 及更低版本的 Google Docs Api 的响应

mysql - 优化Innodb表以释放可用空间