请选择 进入手机版 | 继续访问电脑版

ni-vision

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1290|回复: 0

LabVIEW内存解决方法

[复制链接]
发表于 2020-5-20 23:44:21 | 显示全部楼层 |阅读模式
LabVIEW自动处理内存分配。因为该过程是自动的,LabVIEW在处理数据时必须注意数据的安全性。这就意味着LabVIEW需时常备份数据。如程序需处理大量数据,大量的数据副本可能会导致内存溢出错误。使用下列规范避免内存问题,优化程序以处理大量数据。LabVIEW是一种数据流语言,VI需要更多数据时(例如,数据连线分出两条支路),LabVIEW会创建数据副本。大多数情况下LabVIEW能检测是否需要创建一个新的副本,当不确定是否需要数据副本时,LabVIEW仍然会创建新的数据副本。
使用显示缓冲区分配窗口确定LabVIEW分配内存的位置,该窗口确定LabVIEW用于存放数据副本的数据缓冲区,位于:选择工具»性能分析»显示缓冲区分配,可显示该窗口。

勾选需要查看缓存的数据类型,单击刷新按钮。程序框图上可显示黑色小方块,表明LabVIEW在程序框图上创建的数据缓存的位置。

请按照下列规范编写程序,以减少LabVIEW创建的数据副本:

1)尽量使用占用资源较小的数据类型。例如12,使用8位整型数据,而不是双精度浮点数。
2)使用简单数组。当从波形或动态数据提取数据数组时,LabVIEW会为数据建立额外副本。
3)创建大程序框图。调用子VI时,LabVIEW会创建数据副本。
4)数据流经子VI时,请确保所有程序框图接线端均在条件结构或循环之外。如接线端在条件结构或循环中,LabVIEW将会产生越来越多的数据副本。
5)不要将数据连接至循环内。如要将数据连入循环,可使用移位寄存器,LabVIEW只在第一次循环时复制一个数据副本。如使用隧道,每次循环时,LabVIEW都会创建数据副本。
6)如有可能,使用必须连接的输入。产生默认值时,LabVIEW将会创建数据副本。
7)使用元素同址操作结构,而不是平铺式顺序结构。
  • 不能避免创建大量数据副本,可减少每个副本的大小。传输时,将大量数据分为若干部分,即数据块策略。数据分块时,LabVIEW创建的副本对内存使用没有负面影响。但是,这些副本对数据吞吐率还是有负面影响,所以,仍建议最小化这些副本。


  • 下例证明了这个概念:
  • 需复制512 MB数据至磁盘。一次调用就可获取所有数据并将数据保存至磁盘。但是,即时将数据副本减少为1,仍需传输原始数据和一个数据副本。这意味着要向LabVIEW要求1 GB的内存。更好的方法是建立一个循环,一次获取500 KB的数据并流盘。内存占用减少为1 MB,500 KB用于原始数据,500 KB用于数据副本,这在大多数计算机的内存容量之内。



如下读取text文本中10个字符,每次读取2个,分五次读取。


在许多交互式应用程序中,唯一对数据进行的操作是显示数据。显示500万个数据点超出了大多数显示器的显示能力。LabVIEW图片的宽度一般在300-1000像素。500万个点超过了波形图实际显示点数三个数量级。所以,需大量减少数据点。
例如,在图形上看到精确至像素的大量数据。如一个500万点缓冲区中有一个突波,绘制出的图形应该是一条水平线,上有一个一像素的突波。如果数据是一个正弦波,其周期数大于屏幕的像素宽度。图形应该是一个不间断的频带,且无混叠。最大值最小值截取算法可解决上述两个问题。
最大值最小值截取算法是在每个截取区间内给出一个最大值和一个最小值,以截取部分数据。简单截取使用每个截取区间的第一个数据点作为截取区间的数据点。简单截取将会导致混叠,所以只能在时间紧迫,精度相对不重要的情况下使用该算法。
使用最大值最小值截取算法的第一步是确定图形的像素宽度。使用图形的绘图区:大小:宽度属性,找到该项。每个像素宽度至少需两个截取区间。将像素宽度乘以2,获得区间数量,然后将数据除以区间数量,从而降低算法误差。将数据长度除以这个数,向最近数取整。得到的是截取的数据块大小。对于每个数据块,找到最大和最小点,并将其按照在数据集合中的顺序排列。不必担心最后一个数据块的数据点比其它数据块的少。问题在于小于像素宽度,在屏幕上不可见。将所有最大值和最小值数据连接起来,然后绘制这些数据。屏幕上每个像素宽度上有四个点。这样,即使有一个像素宽度的突波,周围的像素也不会受影响。最大值最小值截取法保证了永远可以看到数据的峰值,显示高频率正弦波产生的不间断频带。绘制到图形的数据较少,绘制的速度就更快。

在下图中,如使用最大值最小值截取算法处理左边的数据,LabVIEW将生成右边的图表。

使用队列或数据值引用在内存中存储大量数据,而无需占用大量内存。使用包含数据的单个元素创建一个队列。要访问数据时,可拆散队列。这使程序的其它部分不能同步访问某个数据。对数据操作完成后,将元素重新排入队列。要传递的唯一对象是队列的引用。传递队列时,LabVIEW不创建额外的数据副本。给队列命名后,可在任何时候使用获取队列函数获取队列引用。创建多个数据对象与创建多个队列一样容易。如典型的生产者消费者模式。

还可使用数据值引用存储数据,不创建额外数据备份。数据值引用比队列速度更快,但是没有超时选项。可为数据创建引用并传递引用,而不是传递数据至队列。如要对数据进行操作,可使用元素同址操作结构。数据值引用写入/读取元素边框节点接受数据值引用输入,用户可在元素同址操作结构中操作数据并替换原内存中的数据。

也可使用功能全局变量在内存中存储大量数据。使用功能性全局变量,LabVIEW将在数据块中保存和访问数据。这样,不需大量内存就可以传输数据。未初始化的移位寄存器可用来保存数据。使用数组函数读取、写入和重新调整数据。数组函数按顺序排列数据,不会创建数据副本。该方法通常比队列方法慢。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|https://www.ni-vision.com

GMT+8, 2020-10-21 00:44 , Processed in 0.030671 second(s), 4 queries , File On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表