当前位置: 首页 > news >正文

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的最大优势之一是自动内存管理。这种内存管理允许用户轻松创建字符串、数组和集群&#xff0c;而无需C/C用户经常担心。但是&#xff0c;这种内存管理设计为绝对安全&#xff0c;因此数据被非常频繁地复制。这通常不会造成任何问题&#xff0c;但是…...

dirsearch网站目录暴力破解

介绍&#xff1a; dirsearch是一个基于python3的命令行工具&#xff0c;常用于暴力扫描页面结构&#xff0c;包括网页中的目录和文件。相比其他扫描工具disearch的特点是&#xff1a; 支持HTTP代理多线程支持多种形式的网页&#xff08;asp,php&#xff09;生成报告&#xff0…...

【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)

目录 线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 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/…...

短视频矩阵系统源码---开发

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统&#xff0c;目前是全国源头独立开发)&#xff0c;开发功能大拆解分享&#xff0c;功能大拆解&#xff1a; 7大模型剪辑法&#xff08;数学阶乘&#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 是一个现代多功能软件开发工具链。 它支持六种流行的编程语言&#xff1a;Oxygene (Object Pascal)、C#、Java、Mercury (Visual Basic.NET™)、Go 和 Swift&#xff0c;适用于所有现代平台。 使用 Elements&#xff0c;您可以为您喜欢的任何平台进行编程- 无论是单…...

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. 编辑距离

提示&#xff1a;努力生活&#xff0c;开心、快乐的一天 文章目录 583. 两个字符串的删除操作&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&#x1f3af;题目总结 72. 编辑距离&#x1f4a1;解题思路&#x1f914;遇到的问题&#x1f4bb;代码实现&…...

Gradient conjugate priors and multi-layer neural networks

动机 先验参数 m , α , β , v m,\alpha,\beta,v m,α,β,v和随机变量 τ \tau τ KL散度的形式是&#xff1a; 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 进行数据并行训练时&#xff0c;每次反向传播都需要执行 all_reduce 操作以同步各个进程的梯度。all_reduce 需要进程组中的所有进程参与&#xff0c;如果某一个进程没有执行 all_reduce&#xff08;一个进程的输入较其他进程少&#xff…...

Cloud Studio连接MySQL,Access denied for一系列问题

官方文档有写如何安装Mysql $ apt update $ apt install mysql-server mysql-client -y$ service mysql start mysql -uroot -p123456进入MySQL命令行 问题出在连接数据库这一步&#xff0c;命令行能进去&#xff0c;但是数据库插件和代码都连不上 Access denied for 大概率…...

经典题型---旋转数组

经典题型—旋转数组 文章目录 经典题型---旋转数组一、题目二、代码实现 一、题目 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步…...

vue如何实现登录数据的持久化

Vue.js是一款流行的JavaScript框架&#xff0c;它可以帮助开发者构建高效且易于维护的单页面应用程序。在Vue.js中&#xff0c;实现登录数据的持久化是一个重要的任务&#xff0c;因为它可以帮助用户保持登录状态并避免频繁的登录操作。在本文中&#xff0c;我们将讨论Vue.js如…...

【Unity3D编辑器开发】Unity3D中实现Transform组件拓展,快速复制、粘贴、复原【非常实用】

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中&#xff0c;常常会遇到频繁复制粘贴物体的坐标、旋转…...

求解仿射变换矩阵

仿射变换是图形学中经常用到的方法&#xff0c;通常但是仿射变换的系数是未知的&#xff0c;需要找到变换前后的三对对应点进行求解。 from affine import Affine import numpy as np参考文献 矩阵最小二乘法求解仿射变换矩阵 def solve_affine(init_points, goal_points) -&…...

【每日一题】—— 最大素因子

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日一题 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日反刍 &#x1f7e1; C跬步积累 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…...

【JavaEE】JUC 常见的类 -- 多线程篇(8)

JUC 常见的类 1. Callable 接口2. ReentrantLock3. 原子类4. 线程池5. 信号量 Semaphore6. CountDownLatch 1. Callable 接口 Callable Interface 也是一种创建线程的方式 Runnable 能表示一个任务 (run方法) – 返回 voidCallable 也能表示一个任务(call方法) 返回一个具体的…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序&#xff08;Program&#xff09; 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序&#xff0c;比如我们使用QQ&#xff0c;就启动了一个进程&#xff0c;操作系统就会为该进程分配内存…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

uni-app学习笔记三十五--扩展组件的安装和使用

由于内置组件不能满足日常开发需要&#xff0c;uniapp官方也提供了众多的扩展组件供我们使用。由于不是内置组件&#xff0c;需要安装才能使用。 一、安装扩展插件 安装方法&#xff1a; 1.访问uniapp官方文档组件部分&#xff1a;组件使用的入门教程 | uni-app官网 点击左侧…...

webpack面试题

面试题&#xff1a;webpack介绍和简单使用 一、webpack&#xff08;模块化打包工具&#xff09;1. webpack是把项目当作一个整体&#xff0c;通过给定的一个主文件&#xff0c;webpack将从这个主文件开始找到你项目当中的所有依赖文件&#xff0c;使用loaders来处理它们&#x…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...

uniapp获取当前位置和经纬度信息

1.1. 获取当前位置和经纬度信息&#xff08;需要配置高的SDK&#xff09; 调用uni-app官方API中的uni.chooseLocation()&#xff0c;即打开地图选择位置。 <button click"getAddress">获取定位</button> const getAddress () > {uni.chooseLocatio…...