TDM和TDMS是一種NI的數據存儲文件格式,兼顧速度、邏輯組織。對於此格式數據文件,NI提供的第三方庫使用也很便捷。關於TDM和TDMS的更多敘述,請自行google、百度,或者去官網了解。這裡主要給出第三方庫的簡單使用,及經過自己的測試,得到的關於TDM和TDMS格式的效率結論。
NI提供的第三方庫使用時配置環境十分簡單,把頭文件、動態庫布置好就行,讀寫文件的例子如下從官網下載第三方庫帶的也有例子):
//寫TDM/TDMS格式文件
int CTDMSTestDlg::WriteDDCFile(const char* filePath, int channelNum, int dataLen, const char* fileType /* = "TDM" */)
{
DWORD begin = ::GetTickCount();
DDCFileHandle testFile;
DDC_CreateFile(filePath, fileType, "", "", "", "", &testFile);//創建指定格式的文件
DDCChannelGroupHandle group01;
DDC_AddChannelGroup(testFile, "group01", "", &group01);//增加一個通道組
DDCChannelHandle* channels = new DDCChannelHandle[channelNum];
double* channelData = CreateRandomData(dataLen);
for (int i = 0; i < channelNum; i++)
{
char channelIdx[20];
itoa(i, channelIdx, 10);
DDC_AddChannel(group01, DDC_Double, channelIdx, "", "", &channels[i]);//增加一個通道,注意每次增加通道時,第三個參數的值要不一樣,否則會覆蓋
DDC_SetDataValues(channels[i], channelData, dataLen); //為新增的通道設置數據
}
DDC_SaveFile(testFile);
DWORD end = ::GetTickCount();
DDC_CloseFile(testFile);
delete[] channels;
delete[] channelData;
return end - begin;
}//讀TDM/TDMS格式文件
int CTDMSTestDlg::ReadDDCFile(const char* filePath, const char* fileType/* = "TDM"*/)
{
DWORD begin = ::GetTickCount();
DDCFileHandle ddcFile;
DDC_OpenFile(filePath, fileType, &ddcFile);//打開文件
unsigned int groupNum = 0;
DDC_GetNumChannelGroups(ddcFile, &groupNum);//獲取通道組的數目
DDCChannelGroupHandle* groups = new DDCChannelGroupHandle[groupNum];
for (int i = 0; i < groupNum; i++)
{
unsigned int channelNum = 0;
DDC_GetNumChannels(groups[i], &channelNum);//獲取通道的數目
DDCChannelHandle* channels = new DDCChannelHandle[channelNum];
for (int j = 0; j < channelNum; j++)
{
unsigned __int64 dataLen = 0;
DDC_GetNumDataValues(channels[j], &dataLen);//獲取數據長度
double* data = new double[dataLen];
DDC_GetDataValuesDouble(channels[j], 0, dataLen, data);//獲取double類型數據
for (int k = 0; k < dataLen; k++)
{
data[k];
}
}
delete[] groups;
groups = NULL;
}
DWORD end = ::GetTickCount();
DDC_CloseFile(ddcFile);
delete[] groups;
return end - begin;
}可以看出,讀寫TDM和TDMS文件是非常方便的。
但是TDM和TDMS格式有什麼區別呢?查過很多資料,最直接的最表象的區別就是,TDM有個XML頭,其他數據用二進制保存,而TDMS的索引啊數據啊都是二進制文件。看官網的介紹,我一直以為TDMS格式是比較提倡的。後來做實驗發現好像不是這麼回事,我得到的結論如下不局限於兩者的區別,還包括別的結論,另外也不保證一定對,但是可以作為參考,大家相互討論):
1、在通道數和每個通道的數據長度相同時,TDM和TDMS格式產生的文件是差不多大小的;
2、在通道數和每個通道的數據長度相同時,TDM和TDMS格式寫入數據時,TDMS格式寫數據總是比TDM格式花費的時間多將近一倍,讀取數據的時間都差不多兩者都有索引,在多次讀取數據時,花費的時間會比第一次花費的時間少,不過TDMS格式在多次訪問後的讀取時間始終比TDM格式的要多一點點);
3、通道數目增加到10000這個級別的時候,寫數據花費的時間明顯增加很多,但是數據長度的增加和寫數據所花費的時間基本呈線性比例;
4、注意寫入數據時要留足空間!這個第三方庫產生的中間文件比最終的數據文件大小還要大很多,比如12G左右的數據文件可能需要至少32G以上的空間。不過如果數據量不大的話,比如128個通道,數據長度為102400,最終數據大小為100M,不算很大,中間文件需要的空間也就不是很大,無需擔心了。
代碼自行下載,使用VS2008。http://down.51cto.com/data/919272 或者 http://pan.baidu.com/share/link?shareid=112939018&uk=1007352492