LabVIEW性能和内存管理 7 LabVIEW中局部和全局变量的内存分配
本文介绍LabVIEW性能和内存管理的几个建议7。
LabVIEW Cleanup
– LabVIEW cleans upmany references when the owning VI goes idle and others when the process closes
– Manually closereferences to avoid undesirable memory growth, particularly for long-runningapplications.
当打开引用的层次结构顶层VI(拥有的VI)空闲时,或者当LabVIEW退出时,LabVIEW会自动关闭引用。当拥有的VI处于空闲状态时关闭的一些引用类型是文件引用、队列和ActiveX引用。其他引用,如VISA和IVI,直到LabVIEW退出才会关闭。
作为程序员,在执行期间关闭引用仍然是一个好主意,原因有几个。如果有一个长时间运行的程序,重复打开引用而不关闭它们可能会导致内存问题,因为每个引用都需要内存。此外,任何与外部代码相关的引用都应该手动关闭,以确保关闭进程以特定的顺序执行,以避免崩溃和其他可能的损坏。在大多数其他开发环境中,关闭引用失败通常会在关闭应用程序时导致崩溃或内存泄漏。
Memory Usage ofthe User Interface
– Every control onthe UI requires memory in order to store the data structure
– At run time,Control and Indicator data is additional copy of block diagram data
– Default data forcontrols may contribute to unnecessary memory usage
– SubVI UIsgenerally do not contribute to memory usage
在LabVIEW中最容易被忽视的内存使用区域之一是前面板。当加载前面板时,LabVIEW必须分配足够的内存来存储所有的数据结构和默认数据。每个控件都包含框图上数据的单独副本,因此内存密集型应用程序应避免显示大量数据,除非需要,否则应避免耗尽内存。
如果有一个非常大的前面板和非常大的控件,例如一个包含30000个元素的数组,那么前面板需要更多的内存来加载。较大的默认数据可能导致内存使用量增加和加载时间变慢。使用VI Analyzer工具包中的Array Default Values测试来识别默认数据不必要地增加内存使用的情况。避免为顶级VI创建一个单一的、单片的前面板。结合一些特性,如子面板控件和动态加载的VIs,如果使用得当,可以减少应用程序的内存使用量。
SubVI通常不会将它们的前面板加载到内存中,除非需要或手动加载,所以SubVI的前面板的内存使用通常不会影响应用程序的内存使用。
SubVIs and MemoryUsage
The executionsystem makes a copy of the control and indicator data of the subVI under thefollowing conditions:
• The front panelis in memory
• The front paneluses data printing
• The block diagramuses Property Nodes that reference front panel controls/indicators
• The VI uses localvariables
• The front paneluses data logging
如果调用SubVI,则只将其编译后的代码加载到内存中,除非需要执行前面板。由于各种原因,前面板可能在内存中。其中几个项目需要内存中的前面板才能正常工作。也有可能SubVI配置为在调用时打开前面板。
在“操作”菜单中,可以启用“完成时打印”和“完成时记录”
Tips for reducingmemory usage
• Operate on datain place
• Do not overusereentrant settings
• Close referencesto avoid leaks
• Avoid operationswhich require the front panel to be in memory
– Ex: Controlreferences
– Save the VI andclose the front panel before running
• Avoid largedefault data in arrays, graphs, etc.
• Only displayinformation on the front panel when necessary
• RequestDeallocation Primitive
LabVIEW中局部和全局变量的内存分配
正在编写一个LabVIEW应用程序,需要知道何时分配和解除分配全局变量以进行内存管理。有没有办法以编程方式释放此内存?
解答
局部变量
局部变量的分配发生在调用VI加载到内存中时。如果是独立VI,则局部变量的内存在运行时分配,并在运行结束时释放。如果局部变量在主VI中静态加载的子VI中声明,则局部变量的内存在主VI加载到内存中时分配,并在主VI卸载后不久由LabVIEW内存管理器解除分配。如果子VI是动态加载的,如下图所示,则局部变量的内存在子VI的调用时分配,并在卸载子VI后不久由LabVIEW内存管理器解除分配。
全局变量
全局变量存在于特殊的全局VI中,与应用程序流程分开。当被另一个VI访问时,它们会将变量的副本带入内存。当调用VI从内存中卸载时,此副本将被销毁。请注意,复制大型数组或其他大型变量可能既密集又耗时。
释放内存
LabVIEW无法以编程方式解分配为全局和局部变量预留的内存,但您可以在顶级VI完成之前解除为运行子VI而留出的内存。在子VI完成其操作后实施请求释放VI,以清除子VI的内存。
需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。