3

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

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

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

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

有没有可用的最佳实践?

谢谢。

4

2 回答 2

2

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

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

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

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

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

于 2013-04-24T20:29:02.680 回答
2

另一种选择是使用chkmem 之类的函数定期检查内存碎片。

您可以集成此函数,以便在每两次迭代的代码中静默调用,或者使用一个timer对象每隔 X 分钟调用一次...

这个想法是使用这些未记录的函数feature memstatsfeature dumpmem获得除了当前分配的最大变量之外的最大可用内存块。使用它,您可以猜测是否有内存碎片的迹象。

检测到时,您会警告用户并指导他们如何保存当前会话(导出到 MAT 文件)、重新启动应用程序以及在重新启动时恢复会话。

于 2013-04-25T13:32:06.947 回答