LabVIEW中管理大型数据

LabVIEW中管理大数据

LabVIEW的最大优势之一是自动内存管理。这种内存管理允许用户轻松创建字符串、数组和集群,而无需C/C++用户经常担心。但是,这种内存管理设计为绝对安全,因此数据被非常频繁地复制。这通常不会造成任何问题,但是当线路中的数据大小开始蔓延到兆字节范围时,副本开始引起内存问题,最终导致内存不足错误。虽然LabVIEW没有针对大型数据线进行优化,但它可以用于大型数据集,前提是程序员知道一些技巧,并为大型框图做好准备。

如何使用

1.大数据存储的方法

有时,需要在内存中存储大型数据集。要存储大型数据集而没有内存问题,需要一种存储机制,该机制允许保存数据的一个副本并以块的形式访问数据,从而允许在不占用大量内存的情况下传输数据。此问题的一个常见解决方案是函数全局,也称为移位寄存器全局。另一种解决方案是单元素队列。

可以使用VI服务器的重入VI创建C/C++指向缓冲区的指针的功能。该缓冲区产生对VI的引用,可以在任何地方传递。如果需要另一个缓冲区,请使用VI服务器启动另一个缓冲区。由于VI是可重入的,因此将创建另一个实例。现在可以传递此VI参考并在任何地方使用它。请注意,使用VI引用将导致对数据的任何访问都使用UI线程。使用UI线程进行数据访问会减慢程序执行速度。可以通过为每个缓冲区创建不同的VI并使每个VI不可重入来解决此问题。

GigaLabVIEW.llb中的GLV_WaveformBuffer.vi是功能全局概念的一个例子。要查看实际应用的概念,请打开GLV_TypicalMemoryStoreAndBrowse.vi。将点数设置为100或更多并运行VI。现在打开GLV_GigaLabVIEWMemoryStoreAndBrowse.vi并执行相同的操作。请注意响应能力和内存使用情况的差异。将点数增加到一百万或更多以查看主要差异。GLV_GigaLabVIEWMemoryStoreAndBrowse.vi使用GLV_WaveformBuffer.vi中的移位寄存器数据库来保存数据。该数据库还包含一个帧缓冲区-一个完整数据的预抽取数组,无需重新计算即可重用。它还使用上一示例中已经引入的分块和显示算法。

GigaLabVIEW.llb中的GLV_GigaLabVIEWMemoryStoreAndBrowseQ.vi是单元素队列概念的一个例子。它使用标准的面向对象技术来创建队列并对其进行操作。用途与GLV_GigaLabVIEWMemoryStoreAndBrowse.vi相同。在本例中,GLV_WaveformBuffer.vi中的不同移位寄存器作为单独的队列实现。使用哪种方法在很大程度上取决于品味和编程风格。

现在已经知道如何创建大型数据集,可以期望分配多少内存?答案取决于几个因素。当LabVIEW分配一个数组时,它会请求一个连续的内存部分。如果内存碎片化,即使仍有数百兆字节的可用内存,也可能会出现内存不足错误。可以通过将数据分块分配来解决此问题。如果正确编写了存储库VI,则对它的访问不应更改。LabVIEW使用签名的32位内存访问,因此总内存绝不会超过2GB。Windows操作系统使用无符号的32位内存访问,但保留高2GB的内存供系统使用,并仅允许在低2GB的内存中执行程序(服务器版本更灵活)。此外,系统DLL占据了2GB用户数据空间中大部分的高四分之一。因此,Windows系统的实际限制是1.0-1.5GB。

不同版本的LabVIEW以不同方式对内存进行分段。这将更改可以分配的最大数组大小。在LabVIEW7中。x及更高版本,通常可以在单个阵列中分配略高于1GB的带宽。LabVIEW8.x由于其较大的功能集,仅允许最大数组大小约为800MBytes。

2.显示数据

要查看实际速度改进,请从GigaLabVIEW.llb打开GLV_TypicalGenerateAndDisplay.vi。打开操作系统的内存监视器。将点数设置为1万或更多并运行它。请注意执行时间和内存使用。关闭VI。现在打开并使用相同的点数运行GLV_GigaLabVIEWGenerateAndDisplay.vi。请注意时间和内存使用情况的差异。GLV_TypicalGenerateAndDisplay.vi使用标准LabVIEW正弦波发生器一次生成整个数据集,然后绘制到屏幕上。GLV_GigaLabVIEWGenerateAndDisplay.vi以块的形式生成数据,抽取这些块,然后丢弃原始数据。它还使用较低级别的正弦波发生器来生成一个简单的数组。当波形数据类型用于图形时,点数足够低,因此复制的成本不是很高。请注意,将该VI从波形数据类型正弦发生器转换为使用较低级别的简单阵列发生器,可在LabVIEW20.7及更高版本中将速度提高20%。

3.突破2GB文件大小障碍(LabVIEW7.1及更早版本)

LabVIEW8.0引入了64位文件指针,因此不需要本节中的技术。早期版本的LabVIEW使用32位有符号整数作为文件指针。这直接将文件的可寻址大小限制为2GB。以10MBytes/s的速度串流到磁盘,这是使用NI数字化仪轻松完成的,在32分3秒内填满20位有符号整数空间。有两种直接选择可以解决此问题。

第一个相当简单。如果使用的是具有NTFS格式磁盘分区(必须是Windows NT,2000或XP)的Windows操作系统,则只需使用LabVIEW写入基元即可写入磁盘。不要将任何东西连接到偏移,并将位置模式连接到电流。可以写入,直到磁盘空间用完为止。

对于一个简单的例子,在GigaLabVIEW.llb中打开GLV_StreamToDisk.vi。本示例将双精度浮点数的升序保存到磁盘。在前面板上设置数据量,运行,然后在存储数据时坐下来放松。默认块大小65,000字节经实验确定为基于Windows的系统的最佳速度。

要读回数据,请反向执行该过程。使用没有偏移输入的读取基元。最多可以使用2GB边界的偏移量。如果在该边界之外使用它,则会收到文件结束错误。但是,如果只是按顺序从磁盘读取数据,则可以读取直到文件末尾。VIGLV_ReadFromDisk.vi显示了这个过程。

此技巧仅适用于上述Windows操作系统。此外,无法在文件中查找高于2GB边界的任意位置并读取那里的数据。

这将我们带到了第二个选项–将64位文件工具与LabVIEW配合使用。一个很好的例子是HDF5。HDF5是由美国国家超级计算应用中心(NCSA)设计、编写和维护的二进制分层文件实用程序。它是免费的,因为它是由美国政府资助的。有关HDF5的完整信息、源代码和二进制文件,请访问http://hdf.ncsa.uiuc.edu/HDF5/。使用HDF5或任何其他64位实用程序需要能够将64位数字传递给实用程序。这就引出了最后一个话题。

4.与64位DLL接口(LabVIEW7.1及更早版本)

LabVIEW8.0引入了对64位整数的完全支持,因此不需要本节中的技术。对于早期版本,有两个选项可用于与64位DLL接口。第一种是编写一个C/C++包装器,它只公开LabVIEW可以本地处理的数据结构。由于这有没有了LabVIEW的易用,我们将讨论第二种选择-使用调用库节点并直接访问DLL,使用一些数字技巧。

可以通过两个64位数字的群集来表示32位数字。64位数字之间的数学运算可以使用众所周知的算法进行编码,以实现任意精度的算术。这些算法超出了本文的范围,但可以在Web上轻松找到它们。

现在有了一种表示64位数字并对其进行数学运算的方法,如何将它们获取到DLL?最简单的方法是将64位实体类型转换为双精度值,然后在DLL请求64位整数时传入双精度值。由于类型转换执行二进制图像转换,类似于C中的并集,因此只要有正确顺序的高阶和低阶双字,一切都会很好。下图显示了正确的顺序和转换为double格式。

调用库节点将负责特定平台的字节排序。此方法也适用于数组,甚至可以在需要它的体系结构(如SPARC)上提供正确的填充。这是因为双精度是一个64位实体。因此,如果DLL具有以下函数原型:  int32 fooFunc(uint64 length, uint64 *elements)

在调用库节点中创建的原型如下所示

Long fooFunc(double length, double *elements).

不能使用此技巧获取函数的返回值。如果希望使用的功能具有原型

uint64 barFunc(void)

那么旧版本的LabVIEW就无法访问完整的返回值。LabVIEW只能获取底部的32位因为函数返回值在处理器的寄存器中返回,而调用列表中的项目则在程序堆栈中返回。在堆栈上,唯一重要的是LabVIEW和DLL使用相同大小的对象。对于函数返回值,整数和浮点值在不同的寄存器中返回。LabVIEW无法访问返回的32位整数的前64位。C/C++包装器是必需的。使用上面的例子,包装器的形式是

void barFuncWrapper(uint64 *barFuncData){

  *barFuncData = barFunc();

   return;

}

幸运的是,这通常不是必需的。NI产品提供了两个与64位DLL接口的示例–两个接口都与HDF5连接。

HWS文件工具是一个C/C++包装器,设计时考虑了LabVIEW接口。由于HDF5的级别非常低且难以掌握,HWSAPI在HDF5复杂性上放置了标准的LabVIEW文件I/O接口。HWS目前可与NI-HSDIO、NI-SCOPE和NI-FGEN驱动程序、模拟和数字波形编辑器以及2004年<>月及以后的任何驱动程序CD一起提供。

sfpFile实用程序集是一个LabVIEW实用工具,可直接连接HDF5,使用尽可能少的C封装器。它可从ni.com获得,但不受NI的支持。它体现了直接使用LabVIEW的64位DLL的原则。此实用程序集中的两个示例VI包含在GigaLabVIEW.llb中。第一个是H5Screate_simple.vi,它是对带有原型的HDF5DLL的直接调用。

int32  H5Screate_simple(int32  rank, const uint64 *dims, const uint64 *maxdims).

LabVIEW调用库节点原型是

long H5Screate_simple(long rank, double *dims, double *maxdims).

第二个是DU64_DBLToDU64.vi,这是一个如何将双精度浮点数转换为两个32位整数的簇的示例,然后转换回双精度以传递给HDF5例程。双精度提供了一种方便的方法来跟踪LabVIEW中的大文件指针整数,因为其精度为52位。由于NTFS只有48位数据空间,因此效果很好。整数值浮点数的加法、减法和乘法通常是精确运算。

请注意,HWS和sfpFile生成相同的文件格式。只是API不同。

5.示例代码

GigaLabVIEW.llb包含本教程中提到的所有示例代码。如果愿意,还可以下载HDF5DLL以防止HDF5示例查找不存在的库。将它们放在系统目录中。

这是LabVIEW的一个功能介绍,更多的使用方法与开发案例,欢迎登录官网,了解更多信息。有需要LabVIEW项目合作开发,请与我们联系。

厂家没有提供LabVIEW的例子。根据通讯协议的相关的说明,编写了适合项目的程序。程序截图如下所示。

相关资料说明,如下所示。

LabVIEW程序,如下附件所示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/166244.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python--循环中的两大关键词 break 与 continue

在Python循环中&#xff0c;经常会遇到两个常见的关键词&#xff1a;break 与 continue break&#xff1a;代表终止整个循环结构 continue&#xff1a;代表中止当前本次循环&#xff0c;继续下一次循环 break&#xff1a; 英 /breɪk/ v. 打破&#xff0c;打碎&#xff0c…

asp.net企业招聘管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio计算机毕业设计

一、源码特点 asp.net 企业招聘管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语 言开发 asp.net企业招聘管理系统 二、功…

【LeetCode】94. 二叉树的中序遍历 [ 左子树 根结点 右子树 ]

题目链接 文章目录 Python3方法一&#xff1a; 递归 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法二&#xff1a; 迭代 ⟮ O ( n ) ⟯ \lgroup O(n) \rgroup ⟮O(n)⟯方法三&#xff1a; Morris ⟮ O ( n ) 、 O ( 1 ) ⟯ \lgroup O(n)、O(1) \rgroup ⟮O(n)、O(1)⟯ C…

库的操作【MySQL】

文章目录 创建数据库字符集和校验规则概念分类例子 查看数据库显示创建语句修改数据库删除数据库备份和恢复备份恢复 创建数据库 SQL: CREATE DATABASE [IF NOT EXISTS] db_name [[DEFAULT] CHARSETcharset_name] [[DEFAULT] COLLATEcollation_name];其中&#xff0c;大写的单…

ubuntu 18.04 开机自启 打开终端执行脚本

一 打开设置开机自启配置程序 alt F2 输入 gnome-session-properties 或 终端输入 gnome-session-properties 二 添加开机自启配置 点右方的add加入 填写名称&#xff0c;可自定义 填写指令&#xff0c;即开机想要执行的指令 gnome-terminal -x bash -c “ls; exec bash” …

SpringBoot(二)集成 Quartz:2.5.4

Quartz是一个广泛使用的开源任务调度框架&#xff0c;用于在Java应用程序中执行定时任务和周期性任务。它提供了强大的调度功能&#xff0c;允许您计划、管理和执行各种任务&#xff0c;从简单的任务到复杂的任务。 以下是Quartz的一些关键特点和功能&#xff1a; 灵活的调度器…

Oracle的立场:官网更换首页与以色列站在一起

Oracle公司的官网&#xff0c;更换了首页内容&#xff0c;明确表明立场&#xff1a;Oracle与以色列站在一起。 声明指出&#xff1a; Oracle谴责针对以色列及其公民的恐怖袭击。Oracle将为其员工、以色列政府和国防机构提供一切必要的支持。 Magen David Adom是一家为以色列公民…

Android屏幕刷新机制

基础知识 CPU运行在Android设备上的中央处理器&#xff08;Central Processing Unit&#xff09;是Android设备的核心组件之一&#xff0c;负责执行计算和控制设备的各种操作。 Android设备上的CPU通常采用ARM架构&#xff0c;如ARM Cortex-A系列处理器。这些处理器具有高性能…

Hadoop3教程(三十三):(生产调优篇)慢磁盘监控与小文件归档

文章目录 &#xff08;161&#xff09;慢磁盘监控&#xff08;162&#xff09;小文件归档小文件过多的问题如何对小文件进行归档 参考文献 &#xff08;161&#xff09;慢磁盘监控 慢磁盘&#xff0c;是指写入数据时特别慢的一类磁盘。这种磁盘并不少见&#xff0c;当机器运行…

Java学习笔记(五)——数组、排序和查找

一、数组 数组可以存放多个同一类型的数据。数组也是一种数据类型&#xff0c;是引用类型。即数组就是一组数据。 &#xff08;一&#xff09;数组的使用 1、使用方式1——动态初始化 &#xff08;1&#xff09;数组的定义&#xff1a; 数据类型 数组名[] new 数据类型…

【C语言】每日一题(添加逗号)

添加逗号&#xff0c;链接奉上 目录 方法1&#xff1a;整体存入思路&#xff1a;代码实现&#xff1a; 方法2&#xff1a;分段输出思路&#xff1a;代码实现&#xff1a; 方法1&#xff1a;整体存入 思路&#xff1a; 整体思路&#xff1a; 我们发现这个整数N对于最后1位是比…

会声会影2023官方破解版激活码

随着短视频、vlog等媒体形式的兴起&#xff0c;视频剪辑已经成为了热门技能。甚至有人说&#xff0c;不会修图可以&#xff0c;但不能不会剪视频。实际上&#xff0c;随着各种智能软件的发展&#xff0c;视频剪辑已经变得越来越简单。功能最全的2023新版&#xff0c;全新视差转…

Hadoop3教程(三十四):(生产调优篇)MapReduce生产经验汇总

文章目录 &#xff08;164&#xff09;MR跑得慢的原因&#xff08;165&#xff09;MR常用调优参数Map阶段Reduce阶段 &#xff08;166&#xff09;MR数据倾斜问题参考文献 &#xff08;164&#xff09;MR跑得慢的原因 MR程序执行效率的瓶颈&#xff0c;或者说当你觉得你的MR程…

《动手学深度学习 Pytorch版》 9.4 双向循环神经网络

之前的序列学习中假设的目标是在给定观测的情况下对下一个输出进行建模&#xff0c;然而也存在需要后文预测前文的情况。 9.4.1 隐马尔可夫模型中的动态规划 数学推导太复杂了&#xff0c;略。 9.4.2 双向模型 双向循环神经网络&#xff08;bidirectional RNNs&#xff09;…

解决windows10、windows11故障:Microsoft-Windows-Kernel-Processor-Power 事件ID:37

一、现象 windows系统日志中出现大量的“Microsoft-Windows-Kernel-Processor-Power”错误。 经过分析&#xff1a;原因是windows配置的【使用电池】默认值是5%&#xff0c;按5%计算出来的功率与CPU的最小功率不兼容&#xff0c;如&#xff1a;本机CPU最高功率是25W&#xff0…

flink中使用GenericWriteAheadSink的优缺点

背景 GenericWriteAheadSink是flink中提供的实现几乎精确一次输出的数据汇抽象类&#xff0c;本文就来看一下使用GenericWriteAheadSink的优缺点 GenericWriteAheadSink的优缺点 先看一下GenericWriteAheadSink的原理图 优点&#xff1a; 几乎可以精确一次的输出&#xf…

数据库MongoDB

MongoDB记录是一个文档&#xff0c;由一个字段和值对组成的数据结构&#xff0c;文档类似于JSON对象。 一个文档认为就是一个对象&#xff0c;字段的数据类型是字符型&#xff0c;值除了使用基本类型外&#xff0c;还可以包括其他文档&#xff0c;普通数组和文档数组。 一、…

FreeRTOS介绍 和 将FreeRTOS移植到STM32F103C8T6

一、FreeRTOS 介绍 什么是 FreeRTOS &#xff1f; Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;Fr…

[翻译]理解Postgres的IOPS:为什么数据即使都在内存,IOPS也非常重要

理解Postgres的IOPS&#xff1a;为什么数据即使都在内存&#xff0c;IOPS也非常重要 磁盘IOPS&#xff08;每秒输入/输出操作数&#xff09;是衡量磁盘系统性能的关键指标。代表每秒可以执行的读写操作数量。对于严重依赖于磁盘访问的PG来说&#xff0c;了解和优化磁盘IOPS对实…

虹科分享 | 赋能物流机器人:CANopen通信如何发挥重要作用?

现代物流领域迅速融入了技术进步&#xff0c;特别是随着自主机器人的兴起&#xff0c;这一趋势越发明显。确保这些机器人在复杂的仓库环境中精确运行的一个关键方面是CANopen通信协议。该协议集成了各种组件&#xff08;电机、传感器、摄像头和先进的电池系统&#xff09;&…