LabVIEW中“内存已满”错误

更新 Dec 4, 2023

适用于

软件

  • LabVIEW

问题详述

当我在LabVIEW中开发大型应用程序时,有时会收到以下错误消息:

 

LabVIEW:内存已满。

顶层VI在程序框图中停止。

有关监视和改进VI内存使用情况的建议,请参阅LabVIEW帮助中的VI Memory Usage主题。 
image.png
Error
Not Enough Memory to complete this operation.


我有大量的可用内存,为什么会收到此错误消息?

 

解决方案

在开发具有大型数组,簇或波形的应用程序时,通常会遇到此错误消息。由于LabVIEW将每个数据集存储在一个连续的内存块中,因此计算机上可用的内存块可能无法满足存储要求。

以下是一些有助于防止出现此错误消息的建议:

减少数组,簇和波形使用的内存

  • 如果您有一个大型数组,请尽可能使用较小的数据类型来表示数组中的元素。例如,如果数组中的元素用双精度浮点数(DBL)表示,但可能的期望值范围是0到100之间的整数,则可以更改数组中的数据类型为无符号8位整数(U8)。 U8这种数据类型占用内存为DBL数据类型占用内存的八分之一。
  • 在LabVIEW 8.5及更高版本中,使用 放置元素结构(In Place Element Structure)来避免使用数组,簇或波形的副本。
  • 如果要绘制来自大型数组的数据波形,请使用最大值最小值抽取max-min decimation)来避免绘制每个数据点的波形。
  • 使用配置文件性能和内存工具帮助缩小范围并确定哪些VI与内存的使用相关 。
  • 分析大型数据集以确定内存已满的位置。采用数据流式传输或向磁盘中写入数据时,使用高性能的分析和报告工具,如TDMS文件和NI DIAdem软件。
 

减少应用程序中的内存使用量

  • 要限制LabVIEW复制数据的次数,请减少应用程序中的全局变量和局部变量的数量。避免使用变量,而应考虑使用生产者/消费者设计模式新数据参考值函数来创建对数据的引用。
  • 将大型VI拆分成若干子VI,并使用“按引用节点调用”动态调用子VI。在VI动态调用子VI之前,子VI不在内存中。
  • 尽可能将大型子VI设置为不可重入VI 。非重入是Windows和Real-Time VI的默认设置。
  • 使用NI LabVIEW桌面执行跟踪工具包来识别可能影响性能的问题,例如内存泄漏和参考泄漏。该工具包还可以收集底层信息,如调用链,线程ID和定位虚拟内存,以及配置文件VI,可执行文件和共享库等。

 

增加LabVIEW内存


关闭LabVIEW中的引用
  • 当您打开应用程序,项目,VI或其他参考源的引用时,LabVIEW会分配内存来存储该引用。要释放LabVIEW存储参考源的内存空间,必须关闭引用。您可以在LabVIEW中关闭引用阅读更多有关信息。

相关信息

如果LabVIEW无法为阵列分配足够大的内存块,则此错误消息最常见。例如,大小为2,000乘2,000个元素的双精度浮点数的2D数组使用大约32 MB。即使32 MB的内存可用,您也可能没有足够大的连续内存块用于阵列。

当包含多于2 ^ 31个元素的数组用于索引For循环时,也会生成此消息。数组最多可包含2 ^ 32个元素,但For循环最多只能索引2 ^ 31个值。这是因为N终端使用带符号的32位整数(I32)数据类型而不是无符号32位整数(U32)数据类型。 I32数据类型的最高有效位用于指定值是正还是负。