• LabVIEW性能和内存管理 7 LabVIEW中局部和全局变量的内存分配


    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开发等相关项目,可联系们。

     

  • 相关阅读:
    asp.net core webapi signalR通信
    jsp当前页面刷新重载并带参数
    D. Non-zero Segments(前缀和)
    ⌈·M·e·r·c·u·r·y·⌋ AC自动机·杂题选做
    盘点世界杯有趣小知识!带你感受体育赛事数据可视化的快乐!
    学生管理系统(python实现)
    错题汇总14
    基于MATLAB的蒲公英算法求解单目标优化问题
    【生日快乐】SpringBoot SpringBoot 提高篇(第二篇) 第5章 SpringBoot 日志 5.4 日志格式
    护理管理学重点
  • 原文地址:https://blog.csdn.net/bjcyck/article/details/127940628