終于寫(xiě)到TDMS了,千呼萬(wàn)喚始出來(lái)啊,其實(shí)所有前面的相關(guān)文章都是為了TDMS作鋪墊。正是由于用戶(hù)提出的種種需求以及其他種種文件格式的缺點(diǎn),才有了TDMS的出現。1. TDMS文件的邏輯格式
本文引用地址:http://dyxdggzs.com/article/201701/337027.htmTDMS文件的邏輯格式遵循TDM三層結構,仍然是文件、通道組、通道三層。用戶(hù)在使用時(shí)只需要關(guān)心這三層就行了。
2. TDMS文件API
TDMS文件格式基本上可以稱(chēng)為NI用在測試測量領(lǐng)域的通用數據文件格式,LabVIEW, CVI/LabWindows, Signal Express, DIAdem中都可以使用,也??吹皆贓xcel, MatLab被中調用。TDMS最核心的內容都在一個(gè)dll中,用戶(hù)如果安裝了LabVIEW,就會(huì )發(fā)現在Program FilesNational InstrumentsSharedTDMS文件夾中有個(gè)tdms.dll的文件。其他軟件正是通過(guò)調用這個(gè)dll的API來(lái)操作TDMS文件的。
在LabVIEW中操作TDMS文件其實(shí)相當方便,有專(zhuān)門(mén)的TDMS面板,提供了TDMS絕大多數的功能。雖然我們一直說(shuō)Write/Read Measurement Files, Storage VIs, TDMS分別面向初級、中級、高級的用戶(hù),但是我個(gè)人覺(jué)得LabVIEW中的TDMS用起來(lái)十分方便,即便是初級用戶(hù),也能很容易的上手。在面板上一共就10個(gè)SubVI,無(wú)論是什么樣的數據類(lèi)型,都可以用這樣同一套SubVI,無(wú)需大量額外的編程工作。

這里可以簡(jiǎn)單介紹一下TDMS面板上的兩個(gè)SubVI,我個(gè)人覺(jué)得十分有用。一個(gè)是“TDMS File Viewer”,當用戶(hù)寫(xiě)完某個(gè)TDMS文件之后,就可以用這個(gè)SubVI來(lái)方便的查看文件的內容,只要輸入TDMS文件的路徑即可,運行VI就會(huì )跳出一個(gè)Viewer的界面,可以查看數據、屬性,并且可以根據數據簡(jiǎn)單的繪制出一些波形圖。另外一個(gè)是“TDMS Defragment”,通常用戶(hù)寫(xiě)完TDMS文件之后,可能會(huì )發(fā)現這個(gè)文件非常大,那么這時(shí)就可以使用這個(gè)SubVI,可以大幅度的減小文件的size。
3. TDMS二進(jìn)制文件
TDMS從設計之初就確定它必須是二進(jìn)制的。二進(jìn)制文件帶來(lái)兩個(gè)優(yōu)點(diǎn):第一,與一般的文本式文件相比,二進(jìn)制文件通常比較??;第二,二進(jìn)制文件讀寫(xiě)通常比較快。這兩個(gè)都是其他二進(jìn)制文件都具備的優(yōu)點(diǎn),就不再多說(shuō)了。
4. TDMS頭文件
用戶(hù)寫(xiě)完TDMS文件之后,會(huì )發(fā)現硬盤(pán)上其實(shí)有兩個(gè)TDMS文件,一個(gè)是.tdms,另一個(gè)是.tdms_index文件,我們通常把前者稱(chēng)為主文件或者數據文件,而把后者稱(chēng)為頭文件或者索引文件。頭文件與主文件相比,最大的區別就是把主文件中的raw data都去掉了,只留下屬性等信息。這樣做,有兩個(gè)目的,第一,可以使得讀文件加快速度,并且支持隨機讀取文件數據,這個(gè)稍后再解釋?zhuān)脩?hù)看完后面的內容就可以理解。第二,可以使得某些軟件的搜索TDMS文件功能加快。比如在DIAdem中搜索TDMS文件,可以根據文件名、通道組名、通道名(其實(shí)這些也是屬性),或者其他某些屬性進(jìn)行搜索,這個(gè)時(shí)候,僅將TDMS的頭文件載入進(jìn)行搜索,其速度遠遠比將TDMS主文件載入搜索快得多。
5. TDMS的內部結構
TDMS文件的內部結構,也就是物理結構,可以在這里找到原文。一般的用戶(hù)并不需要了解這方面的知識就可以方便的使用TDMS文件。在這里介紹這個(gè)內部結構,是為了更好的解釋TDMS文件格式的優(yōu)點(diǎn)。
TDMS內部結構的核心概念是segment,如下圖。為了避免混淆,在這里必須澄清的是,這個(gè)segment的概念與TDM的三層結構(即邏輯結構)沒(méi)有任何對應的關(guān)系,也就是說(shuō),一個(gè)通道可能對應著(zhù)多個(gè)segment,一個(gè)segment中也可能有多個(gè)通道。segment是什么意思?我們在寫(xiě)TDMS文件的時(shí)候,數據本來(lái)可能存放在內存中,那么總要往硬盤(pán)上寫(xiě)這些數據的,每次往硬盤(pán)上寫(xiě)(flush to disk)就會(huì )產(chǎn)生這樣一個(gè)segment。同樣,我們在讀TDMS文件的時(shí)候,也是一個(gè)segment一個(gè)segment的把內容讀出來(lái)。

再稍微深入介紹一下這個(gè)segment中的內容。一開(kāi)始有一些頭信息,比如這個(gè)segment中是否含有meta data,是否含有raw data,version是多少。下面的東西就很重要了,有個(gè)“next segment offset”的信息,指向下一個(gè)segment的起始位置,這個(gè)有什么用呢?比如我要讀某個(gè)通道的數據,發(fā)現這個(gè)segment中并不包含這個(gè)通道的內容,就可以使用這樣的信息直接跳到下個(gè)segment中看下個(gè)segment是否有要找的信息。同樣,還有一個(gè)“raw data offset”的信息,比如用戶(hù)只想讀raw data,并不關(guān)心屬性之類(lèi)的信息,那么這個(gè)“raw data offset”的信息就派上用場(chǎng)了。說(shuō)到這里,就可以明白,TDMS是怎樣支持Random access,怎樣支持獨立的讀屬性信息和raw data的信息。
此外,這個(gè)segment還有一個(gè)極為重要的特點(diǎn)。我們每次寫(xiě)數據,每次往TDMS文件中flush to disk的時(shí)候就在文件的后面添加這樣一個(gè)segment,而不去關(guān)心之前的segment中包含了什么樣的信息。這個(gè)特點(diǎn)非常關(guān)鍵,這就可以使得我們寫(xiě)文件的速度非???,我們并不關(guān)心之前文件中包含了什么信息,也就使得我們寫(xiě)TDMS文件的速度并不和TDMS文件的大小成正比或者有任何關(guān)系。
6. TDMS文件格式的優(yōu)點(diǎn)
我在以前的文章中提到幾個(gè)數據文件格式的技術(shù)要求,我們現在再來(lái)回顧一下,看看TDMS文件是如何實(shí)現這些技術(shù)要求的,這樣也就能看出TDMS文件的優(yōu)點(diǎn)來(lái)。
1)寫(xiě)文件速度必須要快——通過(guò)segment實(shí)現以及二進(jìn)制。
2)向文件追加(append)數據的時(shí)候,速度要快——segment。
3)寫(xiě)文件的速度不能與文件大小成正比——segment。
4)支持隨機的讀取——segment以及頭文件。
5)支持分別讀寫(xiě)描述性信息和原始數據——segment以及頭文件。
6)對讀文件的速度也有一定的要求——segment以及頭文件。
7)文件不能太大——二進(jìn)制。
7. 其他
TDMS文件格式目前(LabVIEW 8.5)只支持Windows和PharLap(一種實(shí)時(shí)操作系統)平臺上。不過(guò)我還看到一個(gè)基于VI的TDMS API,這個(gè)完全基于LabVIEW,既然LabVIEW能在其他平臺上工作,那么這個(gè)小工具也能在其他平臺上工作。當然,效率、性能的會(huì )差很多了。
通??傆腥四肨DMS文件格式和一般的基于Windows API文件流操作比較,然后會(huì )說(shuō)TDMS比那樣的Win32 streaming API慢嘛,是不是TDMS不行?比如在某些磁盤(pán)陣列的配置下,Win32 streaming API可以達到650MB/S,而TDMS只能600MB/S左右。我在這里需要澄清的是,TDMS在保持著(zhù)數據良好邏輯結構(TDM的三層結構)、良好的數據管理的前提下,還能保持著(zhù)這樣高速的性能,這才是TDMS最大的優(yōu)點(diǎn)。Win32 streaming API只是純粹的追求速度(也僅比TDMS快5-10%左右),并不能將測試測量的數據良好的組織好、管理好,用戶(hù)如果片面的追求速度而不管寫(xiě)入文件的數據如何保存如何管理,那就有點(diǎn)得不償失了。
當然,TDMS文件也并不完美,同樣存在著(zhù)種種缺點(diǎn)。比如不能支持方便的刪除某個(gè)通道的功能,目前還不支持其他操作系統等等。相信將來(lái)都會(huì )有改善的。
最后,用一個(gè)不是很恰當的例子來(lái)結束這篇文章。測試測量數據的文件格式,有很多種,文件格式就像我們中午帶飯的飯盒一樣。其他的數據文件格式就是把飯菜都放在一起,吃起來(lái)不方便(速度慢),而且味道都混雜在一起(組織不好);而TDMS文件格式就像是內部有分隔的飯盒,不同的飯菜分開(kāi)存放,吃起來(lái)又方便(速度快)味道又好(組織良好)。
評論