使用C++读写TDM以及TDMS文件

[复制链接]
1196 0

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
  北京上课了的讲师指出,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,不算很大,中间文件需要的空间也就不是很大,无需担心了。

举报

回复

22 个评论

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

扫码领取ofo年卡
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

快速回复 返回列表 客服中心 搜索 官方QQ群
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表