首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ 讀寫 TDM/TDMS 文件實戰:NI 第三方庫使用與效能分析

     編輯:關於C語言

TDM/TDMS 是 NI 的資料儲存格式,兼顧速度與邏輯組織。NI 提供第三方庫,配置環境簡單(頭文件+動態庫),讀寫極便捷。

核心 API 使用範例

寫入文件

int 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;
}

讀取文件

int 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);
      // 處理 data...
      delete[] data;
    }
    delete[] channels;
  }
  delete[] groups;
  DDC_CloseFile(ddcFile);
  DWORD end = GetTickCount();
  return end - begin;
}

TDM vs TDMS 實測結論

  1. 文件大小:同通道數、資料長度下,兩格式產生文件大小相近。
  2. 寫入效能:TDMS 寫入耗時約為 TDM 的 兩倍;讀取時間相近(兩者皆有索引,多次讀取較首次快,但 TDMS 始終略慢)。
  3. 通道數影響:通道數達 10,000 級別時寫入時間顯著增加;資料長度與寫入時間呈線性關係。
  4. 磁碟空間:庫產生的中間文件遠大於最終文件(如 12GB 最終文件需 32GB+ 空間)。小資料量(如 128 通道 × 102400 長度 ≈ 100MB)無需擔心。

代碼下載:VS2008 專案
https://down.51cto.com/data/919272 或 百度網盤

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved