LabVIEW性能和内存管理 6 点击:144 | 回复:0



fjczd

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:552帖 | 36回
  • 年度积分:703
  • 历史总积分:1294
  • 注册:2008年8月14日
发表于:2022-11-18 17:15:01
楼主

LabVIEW性能和内存管理 6

本文介绍LabVIEW性能和内存管理的几个建议6。

数据空间Dataspaces  

VI的数据存储在它的数据空间中

每个VI都有自己的数据空间

可重入VIs有多个数据空间

可重入性和数据空间

不可重入的

ü  每个调用共享一个数据空间

ü  一次只能执行一个调用

ü  较低的内存使用

ü  可以保存状态(例如,对于lv2风格的全局变量)

标准可重入性,又名“预分配克隆”:

ü  每个调用都有自己的数据空间

ü  调用从不需要等待

合并可重入性,又名“共享克隆”

在LabVIEW8.5中添加

ü  每次调用都从共享池中提取一个数据空间

ü  如果需要,将动态分配新的数据空间

ü  调用从不需要等待(除非可能要分配一个新的数据空间)

ü  递归所需

当一个VI是“可重入的”时,它可以同时被调用多次。它可以通过复制数据空间来实现这一点,这样每个并发调用都有自己的副本。在LabVIEW 8.5之前,对可重入性只有两种设置:开或关。在8.5中,添加了一种新的可重入性,称为“共享克隆”。如果一个VI不是可重入的,那么一次只能执行一个调用,因为该VI只有一个数据空间。这使内存使用更低,并且允许VI使用未初始化的移位寄存器(lv2风格全局变量的基础)在调用之间保存状态。

当将一个VI标记为可重入时,默认是“预分配克隆”。这意味着该VI的每一个调用都有自己唯一的数据空间。因此,一个调用不必等待另一个调用。但是,如果多次调用VI,它有很大的数据空间,这可能会导致内存使用量的大量增加。如果在一个标记为可重入的层次结构中有多个VIs,则此效果将成倍增加。在某些情况下,有人将系统中的每个VI都标记为可重入的,最终导致某些VIs的数千个克隆,这最终导致LabVIEW耗尽内存。仔细选择标记为可重入的Vis:关注那些经常调用和并发调用的。

可重入的新选项被称为“共享克隆”,在内部通常将其称为“池式”可重入。有了这个设置,就有了一个用于VI的数据空间池,每个调用从池中获得一个数据空间。如果池中的所有数据空间都在使用中,则创建一个新的数据空间并将其添加到池中。这具有不可重入和完全可重入的Vis的一些好处:内存使用更低,因为只需要和并发调用一样多的数据空间,SubVI调用不需要等待其他调用完成。然而,他们可能必须等待分配一个新的数据空间。缺点是,存储在VI中的任何状态(例如,在移位寄存器中)都与数据空间相关联,每次调用可能获得不同的数据空间。这使得共享可重入对于全局变量来说不太妙了。

使用递归时,必须将递归VI配置为使用共享克隆。这允许每个递归调用都有一个新的数据空间,这样它就不会阻塞,也不会使用无限的内存。

DataspaceContents

  A single largeblock of data

  Execution systemqueue element structures

  Execution data

    Wires

    Temporary data

    Shift registers

  Two types:

    “Top-level”

       Directly stored in the dataspace

       Numerics, clusters, array and string handles, etc.

    “Hair”

       Not stored directly in the dataspace

       Referred to by a top-level allocation

       Can be variable length

       Array and string contents

在考虑数据空间的内容时,区分数据空间中的两种类型的数据有时很重要。顶层数据是直接存储在数据空间中的数据。例如,数据空间中的每个数字都是数据空间中的一个简单分配,占用该数字所需的字节数。Clusters也直接存储在数据空间中。但是,有些类型的数据并不直接存储在数据空间中。最值得注意的是,数组和字符串内容不存储在数据空间中。相反,数据空间本身包含一个指向存储在其他地方的实际数据的指针。这样做是为了使数据可以是可变大小的。

这很重要,因为当使用“显示缓冲区分配”时,只能看到顶层分配。这些点表示直接在数据空间中的分配。它们不会显示数组何时调整了大小,有时会看到只在错误情况下使用的分配。也就是说,缓冲区分配点不是性能问题,也不是每个由分配引起的性能问题都显示为缓冲区分配点。

需要说明的是,上述的例程和文档,都是可以下载的,双击即可打开,其中压缩文件是可以采用粘贴复制的方式,拷贝到硬盘上。这不是图片,各位小伙伴看到后尝试一下,这个问题就不用加微信咨询了。有关LabVIEW编程、LabVIEW开发等相关项目,可联系们。




楼主最近还看过


热门招聘
相关主题

官方公众号

智造工程师