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程序,如下附件所示。
相关文章:
LabVIEW中管理大型数据
LabVIEW中管理大数据 LabVIEW的最大优势之一是自动内存管理。这种内存管理允许用户轻松创建字符串、数组和集群,而无需C/C用户经常担心。但是,这种内存管理设计为绝对安全,因此数据被非常频繁地复制。这通常不会造成任何问题,但是…...
dirsearch网站目录暴力破解
介绍: dirsearch是一个基于python3的命令行工具,常用于暴力扫描页面结构,包括网页中的目录和文件。相比其他扫描工具disearch的特点是: 支持HTTP代理多线程支持多种形式的网页(asp,php)生成报告࿰…...
【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)
目录 线性表的定义及其基本操作(顺序表插入、删除、查找、修改) 四、线性表的链接存储结构 1. 单链表 2. 循环链表 a. 循环链表节点结构体 b. 创建新节点 c. 在循环链表末尾插入节点 d. 删除循环链表中指定值的节点 e. 在循环链表中查找指定值的…...
项目通用pom.xml文件模版
pom.xml模版文件 <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…...
短视频矩阵系统源码---开发
一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统,目前是全国源头独立开发),开发功能大拆解分享,功能大拆解: 7大模型剪辑法(数学阶乘&#x…...
vue3点击表格某个单元格文本就切换成输入框,其他单元格不变化
<el-table :data"data.tableData" height"60vh" border scrollbar-aways-on><el-table-column label"序号" type"index" width"80" fixed /><el-table-column label"操作" width"120" f…...
持续集成部署-k8s-资源调度:HPA - Pod 基于负载指标自动水平扩容缩容
首先我们找一个 Deployment 配置文件: nginx-deploy.yaml apiVersion: apps/v1 # deployment api 版本 kind: Deployment # 资源类型为 deployment metadata: # 元信息labels: # 标签app: nginx-deploy # 具体的 key: value 配置形式name: nginx-deploy...
RemObjects Elements 12.0 Crack
Elements 是一个现代多功能软件开发工具链。 它支持六种流行的编程语言:Oxygene (Object Pascal)、C#、Java、Mercury (Visual Basic.NET™)、Go 和 Swift,适用于所有现代平台。 使用 Elements,您可以为您喜欢的任何平台进行编程- 无论是单…...
STM32标准外设库下载(下载地址与步骤详解)
文章目录 1. 概述2. 官方下载地址3. 步骤详解3.1 打开官网3.2 工具与软件 ➡ 嵌入式软件 ➡ MEMS软件3.3 微控制器软件 ➡ STM32微控制器软件 ➡ STM32标准外设软件库 ➡ 选择产品系列3.4 选择版本 ➡ 点击下载3.5 点击“接受” ➡ 填写邮箱信息 ➡ 点击“下载”3.6 点击接收到…...
【912.排序数组】
目录 一、题目描述二、算法原理2.1快速排序2.2归并排序 三、代码实现3.1快排代码实现3.2归并代码实现 一、题目描述 二、算法原理 2.1快速排序 2.2归并排序 三、代码实现 3.1快排代码实现 class Solution { public:int getRandom(int left,int right,vector<int>&…...
【动态规划】583. 两个字符串的删除操作、72. 编辑距离
提示:努力生活,开心、快乐的一天 文章目录 583. 两个字符串的删除操作💡解题思路🤔遇到的问题💻代码实现🎯题目总结 72. 编辑距离💡解题思路🤔遇到的问题💻代码实现&…...
Gradient conjugate priors and multi-layer neural networks
动机 先验参数 m , α , β , v m,\alpha,\beta,v m,α,β,v和随机变量 τ \tau τ KL散度的形式是: Dynamics of m , α , β , v m,\alpha,\beta,v m,α,β,v Dynamics of m , β , v m,\beta,v m,β,v for a fixed α \alpha α 绿色轨迹连接初始点和目标点…...
DistributedDataParallel数据不均衡
背景 在使用 DistributedDataParallel 进行数据并行训练时,每次反向传播都需要执行 all_reduce 操作以同步各个进程的梯度。all_reduce 需要进程组中的所有进程参与,如果某一个进程没有执行 all_reduce(一个进程的输入较其他进程少ÿ…...
Cloud Studio连接MySQL,Access denied for一系列问题
官方文档有写如何安装Mysql $ apt update $ apt install mysql-server mysql-client -y$ service mysql start mysql -uroot -p123456进入MySQL命令行 问题出在连接数据库这一步,命令行能进去,但是数据库插件和代码都连不上 Access denied for 大概率…...
经典题型---旋转数组
经典题型—旋转数组 文章目录 经典题型---旋转数组一、题目二、代码实现 一、题目 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步…...
vue如何实现登录数据的持久化
Vue.js是一款流行的JavaScript框架,它可以帮助开发者构建高效且易于维护的单页面应用程序。在Vue.js中,实现登录数据的持久化是一个重要的任务,因为它可以帮助用户保持登录状态并避免频繁的登录操作。在本文中,我们将讨论Vue.js如…...
【Unity3D编辑器开发】Unity3D中实现Transform组件拓展,快速复制、粘贴、复原【非常实用】
推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中,常常会遇到频繁复制粘贴物体的坐标、旋转…...
求解仿射变换矩阵
仿射变换是图形学中经常用到的方法,通常但是仿射变换的系数是未知的,需要找到变换前后的三对对应点进行求解。 from affine import Affine import numpy as np参考文献 矩阵最小二乘法求解仿射变换矩阵 def solve_affine(init_points, goal_points) -&…...
【每日一题】—— 最大素因子
🌏博客主页:PH_modest的博客主页 🚩当前专栏:每日一题 💌其他专栏: 🔴 每日反刍 🟡 C跬步积累 🟢 C语言跬步积累 🌈座右铭:广积粮,缓称…...
【JavaEE】JUC 常见的类 -- 多线程篇(8)
JUC 常见的类 1. Callable 接口2. ReentrantLock3. 原子类4. 线程池5. 信号量 Semaphore6. CountDownLatch 1. Callable 接口 Callable Interface 也是一种创建线程的方式 Runnable 能表示一个任务 (run方法) – 返回 voidCallable 也能表示一个任务(call方法) 返回一个具体的…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
return this;返回的是谁
一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请,不同级别的经理有不同的审批权限: // 抽象处理者:审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
