1.NI-DAQmx高速数据流盘
1.1什么是TDMS格式
TDMS文件格式是NI推荐易于交换、固有结构化、具有高速流传输能力的文件格式,用于将基于时间的测量数据保存到磁盘,以实现高性能、可用性和复用性。借助NI-DAQmx驱动,可以实现将数据快速传输到磁盘中,速率可高达1.2GB/s。
NI 定义了技术数据管理 (TDM) 解决方案,其中包括三个集成组件:
- NI TDMS 文件格式用于保存详细记录的测量数据
- NI DataFinder 可快速定位之前存储的数据集
- NI DIAdem 或 LabVIEW DataFinder Connectivity VI 用于处理数据和创建报告
1.2TDMS文件结构概述
TDMS 文件格式采用三个层级结构,如图所示:文件、组和通道。
文件级别可以包含无限数量的组,每个组可以包含无限数量的通道。
在层次结构的每个级别,您可以存储无限数量的自定义标量属性。
每个级别都接受无限数量的自定义属性,以实现记录良好且可搜索的数据文件。
无需设计自己的标头结构。随着您的文档要求增加,您不必重新设计您的应用程序;您只需扩展模型即可满足您的特定需求。
您用于记录测量数据的自定义属性越多,日后通过使用 NI DataFinder 客户端(可从用户那里抽象出复杂的数据库通信)来定位测量数据就越容易。
TDMS数据段布局
数据以段为单位写入TDMS文件。每次将数据附加到TDMS文件时,都会创建一个新的数据段。有关此规则的例外情况,请参考本文的元数据和原始数据部分。数据段由以下三部分组成:
- 前端—包含基本信息,如标识文件为TDMS的标签、版本号,以及元数据和原始数据的长度信息。
- 元数据—包含数据段中全部对象的名称和属性。对于包含原始数据(通道)的对象,元数据部分还包含索引信息,用于在数据段中找到该对象的原始数据。
- 原始数据—与数据段中包含的任意对象相关联的所有原始数据的连续数据块。原始数据部分可以包含交错的数据值或一系列的连续数据块。原始数据部分还可以包含来自DAQmx的原始数据。
关于TDMS文件结构格式更详细的内容请看NI的链接:TDMS文件格式内部结构 - NI
1.3使用NI软件写入和读取TDMS文件
写入测量文件ExpressVI
最简单的方式是使用 写入测量文件ExpressVI。该Express VI 提供了基于对话框的简单配置,但牺牲了性能,并且不适合高速流或实时应用。
- 文本 (LVM) - 将文件格式设置为基于文本的测量文件 ( ),并将文件名
.lvm
中的文件扩展名 设置为 ..lvm
- 二进制 (TDMS) - 将文件格式设置为不带 XML 标头的二进制测量文件 ( .tdms ),并将文件名中的文件扩展名设置 为 .tdms
- 带 XML 标头的二进制 (TDM) - 将文件格式设置为二进制测量文件 ( ),并将文件名
.tdm
中的文件扩展名设置 为 ..tdm
- Microsoft Excel (XLSX) - 将文件格式设置为 Microsoft Excel 文件类型 (
.xlsx
),这是一种开放的 XML 文件格式。文件名中的文件扩展名 设置为.xlsx
.
使用 Express VI 配置对话框中的“操作”选项来配置文件保存选项。选项包括:
- 将数据保存到一个文件或一系列文件(解析数据并保存在多个文件中)。
- 一次或每次 Express VI 执行时提示用户输入文件名。
如果文件已存在,您可以选择以下选项:
- 重命名现有文件
- 将序号附加到文件名
- 覆盖文件
- 将数据附加到现有文件
选择流盘路径
右键单击 Express VI 并转到属性
在前面板上创建一个控件,用户可以在其中指定文件路径。
添加时间戳
对于写入lvm文件
对于tdms文件,选择x value(time)columns为 one column only
如果未勾选时间戳选项,耶尔可以根据时间的相关信息进行计算
以这种方式呈现数据是为了减小 TDMS 文件的大小。如果时间戳作为值存储在每个测量组选项卡上,则 TDMS 文件将在磁盘上占用数倍的数据。
如何计算相对于测量开始时间的时间戳
要计算每个数据点的相对时间戳,我们可以使用以下公式:
time_relative = ' wf_start_offset' + 'wf_increment' x [样本数]
示例:计算每个数据点的相对时间戳时从上面的示例 TDMS 文件屏幕截图中的“组 1”中的“通道 1”,我们将得到以下结果。
- 示例 0(第一个屏幕截图中的单元格 A2)- 0.000 秒
- 示例 1(第一个屏幕截图中的单元格 A3)- 0.001 秒
- 示例 2(第一个屏幕截图中的单元格 A4)- 0.002 秒
- 等等。(可以为测量通道中的每个样本计算一个唯一值。)
如何使用绝对测量时间计算时间戳
要计算测量每个数据点的绝对时间,我们可以使用以下公式:
time_absolute = ' wf_start_time' + 'wf_increment' x [样本数]
示例:计算绝对时间戳时对于上面示例 TDMS 文件屏幕截图中“组 1”中的“通道 1”,我们将得到以下结果。
- 示例 0(第一个屏幕截图中的单元格 A2)- 6/11/2020 6:03:13.385 PM
- 示例 1(第一个屏幕截图中的单元格 A3)- 6/11/2020 6:03:13.386 PM
- 示例 2(第一个屏幕截图中的单元格 A4)- 6/11/2020 6:03:13.387 PM
- 等等。(可以为测量通道中的每个样本计算一个唯一值。)
为了保证数据流盘的性能,最好是使用底层的文件函数。
Data Storage Express VI
注意: “Write Data” VI (写入数据VI)除信号输入外,还有两个输入:名称和单位。
通过双击 “Write Data” VI,可以选择要通过配置对话框保存的其他信息,类似于 "Write to Measurement File " Express VI 的过程。
TMDS写入
TDMS读取
TDMS 写入自定义属性
TDMS读取自定义属性
合并TDMS文件数据
1.4查看TDMS文件
NI的开发环境都是可以写入和读取TDMS文件,但是未安装NI软件的电脑就存在局限性,这时候就需要安装NI的TDM插件,他是微软Excel的免费插件,使得其他用户也可以自由访问TDMS文件。
下载TDM Excel Add-In for Microsoft Excel - NI
TDM Excel 插件概述
有时,在写入TDM数据文件后,必须对数据文件进行手动修改或扩展。用户可以使用免费的 TDM Excel 插件在 Excel 中打开 TDM 文件,并将其编辑保存到新的 Excel 文件中。只要对新 Excel 文件中的数据或属性所做的修改继续遵循原始数据布局(如本文档中所述),则可以使用 NI 件读取新 Excel 文件免费的 ExcelTDM 数据插件。只要维护架构,使用 Excel 进行手动修改的过程就可以无限期地重复。
添加、更改或删除文件属性
添加、更改或删除组属性
添加、更改或删除通道属性
1.5NI-DAQmx高速数据记录
DAQmx Configure Logging VI。此VI可用于配置在DAQ选板上的单个VI内如何将数据写入到TDMS文件中。 这样一来,此VI不仅易于使用,并且易于集成到现有的数据采集应用中,而且经过后台优化后,这也是将数据写入磁盘的最快方式。
这种将数据流式传输到磁盘的方法可以通过优化多个内存操作并绕过 Windows、LabVIEW 和 TDMS 缓冲区来实现最大效率,从而真正突破高速测量数据流的界限。使用 DAQmx 配置日志 VI 进行的测试已实现超过 1.2 GB/s 的数据流速率。
1.6可选数据压缩功能
影响数据流盘性能的主要因素
- 磁盘I/O带宽
- CPU带宽
- 总线带宽
NI-DAQmx提供了一个非常简单的数据压缩方式,即将样本末端的位省略掉,并将得到的样本封装到内存。开发人员可将NI-DAQmx配置为省略样本中的一个或多个最低有效位。例如,可以将具有24位分辨率和32位采样容量的通道配置为仅返回20个最高位。这样总共省略了12个位,其中包括8个未使用的位,因而可将所需的磁盘空间减少37.5%。但在某些情况下,样本包含了未使用的位,这样省略掉这些位并不会“丢失”数据。例如,一个具有12位分辨率和16位采样容量的通道包含4个未使用的位。舍弃这4个位不会带来造成数据丢失,却可以减少25%的所需磁盘空间。NI-DAQmx不执行任何其他无损或有损压缩算法,例如LZW或JPEG。
1.7设置TDMS文件中通道顺序
1.8如何减少TDMS文件的体积
有多种选项可以减小 TDMS 文件的大小:
- 一次将多个数据点写入 TDMS 文件。
- 使用TMDS碎片整理VI来整合数据。您可以将其包含在代码末尾,以确保在应用程序结束之前对文件进行碎片整理,以节省磁盘空间。
- 在写入 TDMS 文件之前,使用TDMS设置属性功能缓冲配置的数据量,在 TDMS 文件中设置一个名为“NI_minimumBufferSize”的特殊属性。
当您向此属性写入数字时,库将缓冲内存中某个段的所有数据,直到有那么多样本为止。这是最简单的解决方案,但确实意味着:
a) 额外的 RAM 使用量
b) 如果发生崩溃/断电,您将丢失最新的数据。 - 写入更大的数据集,虽然仍会产生碎片文件,但是元数据分布在更多的原始数据中,效果不明显
- 编写单独的文件并稍后将他们组合起来
- 如果磁盘空间是主要问题,请在存储之前对文件进行碎片整理。TDMS 调色板中有一个碎片整理功能,可以在文件完成后使用该功能来减小大小。
DMS 内置了许多优化,以尝试使占用空间尽可能接近二进制。
当您编写具有相同频道列表和元数据的两个段时,TDMS 格式将跳过该段的元数据(甚至是开头),这意味着所使用的空间仅为原始数据的空间,从而提供有效的“压缩率”为100%。
假设我们将完全相同的通道重复写入文件,我们只得到一份元数据副本,其余的都是原始数据,这正是我们想要的。
但考虑一下这种情况:
在一种常见情况下,我们可能希望向文件写入两次。每次 TDMS 写入都会向文件写入一个段,在这种情况下,因为它将在两者之间交替,所以元数据确实会发生变化,并且每次都必须写入。这会导致文件碎片化。
在我们使用多个 TDMS 写入节点写入单个文件的任何场景中,都会发生这种情况。
您还可以看到碎片级别将取决于每次写入中包含的原始数据量。
如果我们每次写入10,000 个点,元数据仍然比原始数据小得多,虽然碎片化,但可能是可以接受的。
然而,如果我们每次写入1 个样本,那些绿色区域将会缩小很多,您最终可能会得到比实际数据更多的元数据!
我们可以通过查看使用文件时生成的 tdms_index 文件的大小来衡量碎片的影响。这本质上是从文件中提取的所有元数据。
在这里我们可以看到文件2.tdms正是我们想要的。1kB 元数据到 15MB 文件。然而, 0.tdms 的碎片很严重,36MB 文件中的 12MB 用于元数据(在这种情况下,文件0.tdms和1.tdms实际上包含完全相同的数据,但使用了稍后提到的一些技术,并在提到的示例中进行了演示)在最后)。
在处理碎片文件时,您还会看到库的内存使用量随着时间的推移而增加。这是因为 TDMS 库在内存中保存文件的模型,整理元数据,以便它可以执行诸如执行随机访问之类的操作。元数据越多,需要的内存就越多。
(相反,一些报告称,按照意外的严格定义,这并不是“内存泄漏”,它是完全可以预测的,并不是说它会让你感觉好很多!)
要减少内存,您需要减少碎片,或者定期关闭并打开新文件。
1.9将大数据集的TDMS文件导出到excel文件
要将TDMS数据集导出到Excel,请参考以下步骤:
- 右键单击所需的TDMS文件,然后从“打开方式”选项中选择“ Excel导入器” 。
- 选择“ Excel导入器”后,将自动打开一个Excel工作簿,并将TDMS文件的所有内容导入其中。
如果您的数据长度大于1,048,575,则在执行步骤1后将显示以下窗口。
这是由于Microsoft Excel支持的最大行数为1,048,576。因此,您必须确定导入的开始索引。也就是说,如果要将2,000,000个数据从TDMS文件的单个通道导出到Excel文件,则必须执行两次导出,其中第一次导出的起始索引为1,而第二次导出的起始索引为1,048,576。
未完成,后续更新其他文件格式和数据库