LabVIEW大量数据的内存管理

LabVIEW自动处理内存分配。因为该过程是自动的,LabVIEW在处理数据时必须注意数据的安全性。这就意味着LabVIEW需时常备份数据。如程序需处理大量数据,大量的数据副本可能会导致内存溢出错误。使用下列规范避免内存问题,优化程序以处理大量数据。

注: 也可使用记录性能和内存信息窗口,获取和显示VI执行事件和内存使用的数据。使用该窗口确定引发内存问题的VI。

一、减少大量数据的数据副本

LabVIEW是一种数据流语言,VI需要更多数据时(例如,数据连线分出两条支路),LabVIEW会创建数据副本。大多数情况下LabVIEW能检测是否需要创建一个新的副本,当不确定是否需要数据副本时,LabVIEW仍然会创建新的数据副本。

注: 使用LabVIEWReal-Time模块时,内存复制会影响实时应用程序的确定性。

使用显示缓冲区分配窗口确定LabVIEW分配内存的位置。该窗口确定LabVIEW用于存放数据副本的数据缓冲区。

注: 下列技巧中有些与良好的LabVIEW编程惯例不一致,这些技巧只在处理海量数据时使用。

使用占用资源较小的数据类型。例如,使用16位整型数据,而不是双精度浮点数。

使用简单数组。当从波形或动态数据提取数据数组时,LabVIEW会为数据建立额外副本。

创建大型程序框图或内嵌子VI可减少开销。避免调用子VI,因为调用子VI时LabVIEW会创建数据复制。

数据流经子VI时,请确保所有程序框图接线端均在条件结构或循环之外。如接线端在条件结构或循环中,LabVIEW将会产生越来越多的数据副本。

如请不要将数据连接至循环内。如要将数据连入循环,可使用移位寄存器,而不是隧道。如使用隧道,每次循环时,LabVIEW都会创建数据副本。

如有可能,使用必须连接的输入。产生默认值时,LabVIEW将会创建数据副本。

使用元素同址操作结构,而不是平铺式顺序结构。

提示: 较新版本的LabVIEW比早期版本自动复制更多数据副本。版本越新,LabVIEW处理大量数据的功能就越好。

二、传输大量数据

如不能避免创建大量数据副本,可减少每个副本的大小。传输时,将大量数据分为若干部分,即数据块策略。数据分块时,LabVIEW创建的副本对内存使用没有负面影响。但是,这些副本对数据吞吐率还是有负面影响,所以,仍建议最小化这些副本。下例证明了这个概念。

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

优点是节省了LabVIEW分配大量内存所需的海量时间。在多数计算机上,250 MB数据的流盘时间不超过15秒。如按照其它方法,LabVIEW分配1 GB RAM的时间很可能超过15秒。

如将大量数据流盘或存储在冗余磁盘阵列(RAID)中,也可不通过缓冲区传输数据,以减少数据副本,加快数据传输。如要禁用缓冲区,将TRUE值连接至打开/创建/替换文件函数的禁用缓存输入端。

三、显示大量数据

在许多交互式应用程序中,唯一对数据进行的操作是显示数据。显示500万个数据点超出了大多数显示器的显示能力。LabVIEW图片的宽度一般在300-1000像素。500万个点超过了波形图实际显示点数三个数量级。所以,需大量减少数据点。

例如,在图形上看到精确至像素的大量数据。如一个500万点缓冲区中有一个突波,绘制出的图形应该是一条水平线,上有一个一像素的突波。如果数据是一个正弦波,其周期数大于屏幕的像素宽度。图形应该是一个不间断的频带,且无混叠。最大值最小值截取算法可解决上述两个问题。

最大值最小值截取算法是在每个截取区间内给出一个最大值和一个最小值,以截取部分数据。简单截取使用每个截取区间的第一个数据点作为截取区间的数据点。简单截取将会导致混叠,所以只能在时间紧迫,精度相对不重要的情况下使用该算法。

使用最大值最小值截取算法的第一步是确定图形的像素宽度。使用图形的绘图区:大小:宽度属性,找到该项。每个像素宽度至少需两个截取区间。将像素宽度乘以2,获得区间数量,然后将数据除以区间数量,从而降低算法误差。将数据长度除以这个数,向最近数取整。得到的是截取的数据块大小。对于每个数据块,找到最大和最小点,并将其按照在数据集合中的顺序排列。不必担心最后一个数据块的数据点比其它数据块的少。问题在于小于像素宽度,在屏幕上不可见。将所有最大值和最小值数据连接起来,然后绘制这些数据。屏幕上每个像素宽度上有四个点。这样,即使有一个像素宽度的突波,周围的像素也不会受影响。最大值最小值截取法保证了永远可以看到数据的峰值,显示高频率正弦波产生的不间断频带。绘制到图形的数据较少,绘制的速度就更快。

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

编辑

添加图片注释,不超过 140 字(可选)

四、存储大量数据

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

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

注: 可在类属性对话框的继承页上设置只有LabVIEW类的成员VI才可创建类的数据值引用。

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

上文中提到的例子和资料,均在word中的附件里,可点击下载。

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

LabVIEW大量数据的内存管理 - 北京瀚文网星科技有限公司 (bjcyck.com)

LabVIEW大量数据的内存管理相关推荐

  1. iOS开发——MRC(手动内存管理)

    iOS开发--MRC(手动内存管理) 内存分配区域 栈区 堆区 总结 常量区 总结 代码区 总结 全局区 关于如何查看一个对象在堆区 / 栈区 需要知道的知识 手动引用计数MRC 四个法则 非自己生成 ...

  2. flink分析使用之八内存管理机制

    一.flink内存机制 在前面的槽机制上,提到了内存的共享,这篇文章就分析一下,在Flink中对内存的管理.在Flink中,内存被抽象出来,形成了一套自己的管理机制.Flink本身基本是以Java语言 ...

  3. 1、虚拟机内存管理、运行时数据区、线程共享区、Java堆、新生代、老年代、Eden区域分配、方法区、线程独占区、虚拟机栈

    1.Java虚拟机内存管理 1.1.运行时数据区[Runtime Data Area] 1.1.1.线程共享区 1.1.1.1.Java堆[heap] 1.1.1.1.1.新生代.老年代.Eden区域 ...

  4. 【redismemcached】数据类型、内存管理、数据持久化和集群管理的区别

    这几年redis很火,redis也常常被当做memcached的挑战者被提到桌面上来.关于redis和memcached的比较比比皆是.然而,redis真的在功能.性能以及内存使用效率上都超越memc ...

  5. C/C++内存分配与Linux内存管理进程所涉及到的五个数据段 .

    一. 在c中分为这几个存储区 1.栈 - 由编译器自动分配释放 2.堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 3.全局区(静态区),全局变量和静态变量的存储是放在一块的, ...

  6. C语言的内存管理(堆,栈,代码段,数据段)

    C语言的内存管理(堆,栈,代码段,数据段) 一.几个基本概念 在C语言中,关于内存管理的知识点比较多,如函数.变量.作用域.指针等,在探究C语言内存管理机制时,先简单复习下这几个基本概念: 1.变量: ...

  7. 95-290-382-源码-内存管理-Buffer-Flink运行时之统一的数据交换对象

    2.统一的数据交换对象 ​ 在Flink的执行引擎中,流动的元素主要有两种:缓冲(Buffer)和事件(Event).Buffer主要针对用户数据交换,而Event则用于一些特殊的控制标识.但在实现时 ...

  8. Java内存管理:Java内存区域 JVM运行时数据区

    Java内存管理:Java内存区域 JVM运行时数据区 在前面的一些文章了解到javac编译的大体过程.Class文件结构.以及JVM字节码指令. 下面我们详细了解Java内存区域:先说明JVM规范定 ...

  9. 自我管理数据缓冲区内存

    http://www.ibm.com/developerworks/cn/linux/wa-memmng/index.html 简介: C 程序设计语言定义了两个标准的内存管理函数:malloc() ...

最新文章

  1. JDK源码解析 Runable是一个典型命令模式,Runnable担当命令的角色,Thread充当的是调用者,start方法就是其执行方法
  2. php访问数组用引号_php双引号中访问数组元素报错如何解决
  3. 服务器log文件清理,服务器日志切割清理工具(LogCutter)
  4. Codeforces Round #670 (Div. 2)
  5. 通过Apache Kafka集成流式传输大数据
  6. 如何用1年时间获得3年成长?
  7. 计算机被格式化怎么找回资料,电脑文档被格式化,怎么恢复格式化文档
  8. 数据结构与算法-二叉树遍历
  9. equals方法 和 ==的区别
  10. echarts3Dearth 地球数据可视化添加 tooltip效果和涟漪扩散的效果
  11. 构建数据指标预警系统
  12. matlab中样本相关系数的计算与测试
  13. 安全系统工程徐志胜电子版_安全系统工程-第3版
  14. 强大的类似qq截图或者微信截图功能软件
  15. JAVA经典算法大全
  16. Docker操作步骤列表
  17. 中国跨5个时区,东南西北的极点坐标信息
  18. EIP-3523:半同质代币介绍
  19. Modelsim仿真流程及相关命令
  20. 如何把普通的五比四的照片做成5寸照片

热门文章

  1. 第25节 实例-透视投影和正交投影切换
  2. POJ 1611 The Suspects 并查集
  3. 艾美捷总胶原蛋白检测试剂盒特征相关研究
  4. __iLINE__和__FILE__等内置宏的含义
  5. 仿写Android屏幕解锁小应用
  6. 大数据开发之数仓建模
  7. 软考知识点——加密算法、常见计算机网络知识
  8. 达梦数据库查询与操作
  9. 如何在CSDN获取更多的铁粉?
  10. 雅虎裁员风波落定:1000人被裁 Q4利润下降