• MongoDB性能测试(1)


    研究MongoDB一两个月了,写此文章供大家参考参考。本文如有不足之处还请大师们指出。

     

     


     

      1、MongoDB测试程序说明

      2、数据结构解析

      3、笔记本测试数据

      4、服务器测试数据

     1、MongoDB测试程序说明

     

      本文主要测试的是mongodb插入数据的效率。利用的是某老师提供的mongodb二次开发接口。

    数据的结构体为:

     

    View Code
        Struct keyvalmeta{
        Char name[64];
        Int valType;
        DateTime nStartTime;
        DateTime nEndTime;
        Int nUserDefMetaSize;
        Char* pUserDefMetaDat;
        }

     

      上述结构体简略了其他部分,只是提供一个参考。

    结构体语义解析:

    •   valType表示的是Value的类型,该对象是对于三维空间的对象。
    •   nStartTime有效时间起始点。
    •   nEndTime有效时间终止点。
    •   nUserDefMetaSize用户自定义的元数据长度。
    •   pUserDefMetaDat用户自定义的元数据,如XML格式。

     

     

      某老师的mongodb二次开发接口就不提供了,本文只注重于性能测试,本人也分享下测试的思路。

      下面为测试的代码,先初始化结构体的数据,然后使用clock()函数(时之间的CPU时钟计时单元)来设置起始时间start,通过一个循环插入数据,循环以后再次记录结束时间finish。

    View Code
    CreateAndConnect();//connect the mongodb
    
    InitOrOpenDb();//initial the db
    
    OpenWorkspace();//open a work space
    
     
    
    //initial the data
    
    int nMaxSize=32*1024*1024;
    
    char* pFileDat=new char[nMaxSize];
    
    int nFileSize;
    
    keyvalmeta kvm;
    
    strcpy(kvm.name,"whu");
    
    const int TESTNUM=100000;
    
    clock_t start,finish;
    
     
    
    //get the file's data
    
    FILE* fp;
    
    fp=fopen("c:\\bin\\1.xml","rb");
    
    nFileSize=fread(pFileDat,1,nMaxSize,fp);
    
    fclose(fp);
    
    kvm.nUserDefMetaSize=nFileSize;
    
    kvm.pUserDefMetaDat=new char[kvm.nUserDefMetaSize];
    
     
    
    //start the test
    
    start=clock();
    
    for(int i=0;i<TESTNUM;i++)
    
    {
    
    InsertKeyVal(kvm);//insert the record
    
    }
    
    delete [] kvm.pUserDefMetaDat;
    
    finish=clock();
    
    cout<<"time:"<<(double)(finish-start)/CLOCKS_PER_SEC<<"S"<<endl;
    
    cout<<"insert finished"<<endl;
    
    getchar();

      从上述的程序可以得知,可变的量为两个:循环次数TESTNUM和文件流大小1.XML。

     

     2、数据结构解析

     

      在测试前,我先讲下一般测试的注意事项。

    1.  测试最好用台式机并且稳定性较强(通常是散热问题影响较大),不建议使用笔记本。
    2.  通常有的服务器或者普通台式机因为还在使用32位系统,我就要提醒下,32位系统最多存储1G多,所以,插入大量的数据时就要注意下。64位系统的最多能存储32位系统*232 ,大概是4EB左右(1EB=1024PB,1PB=1024TB,1TB=1024G)。

     

      一开始我使用笔记本测试性能。插入100w条数据,XML大小为258kb。使用MongoDBVUE查看如图

     

      通过UI界面只能知道大概的数据情况,要了解具体数据还要通过shell命令的db.keyvalmeta.stats(),输出如图所示:

     

    mongodb存储解析 :

    插入的单个数据块大小为  258+104=362(byte)  其中258为插入文件的大小,104为结构体的大小

    总Size=362*1000000=362000000(和shell命令里的360000024相差无几)

    内存利用率=1-(storageSize-size)/storegeSize*100%=87.6%,内存率利用挺高的。

     

    3、笔记本测试数据

     

    通过64位系统的笔记本测试,使用的时间如下表所示,每次显示的时间不是很稳定。

    29.54  50.3  42.66  55.96  57.48  59.26  72.19  89.75  67.92  58.82

    55.83  61.96  70.2  64.12

    去掉最低值29.54和去掉最高值89.75。平均的时间为:59.72,花费的时间有点吓人,插入100w条数据要等个一分钟左右。

     

     

    数据的浮动比较大,所以不建议使用笔记本,稳定性不好。

     

    4、服务器测试数据

     

    下面使用的是32位系统的台式机(本机子是服务器,读盘速度较快),测试方法和上述的笔记本一样。A/B,A代表的是插入的条数,B代表的是文件大小,后面显示的数据为插入花费的总时间。

     

     

    根据上表,可以统计下数据如下。

    最主要的是通过图表更直观点。

    下图表第一个图以文件大小为横坐标,花费的时间为纵坐标;第二个图以插入的条数为横坐标,花费的时间为纵坐标:

        

    通过图表可以看出,文件大小的所花费的时间浮动比较小,文件大小和插入时间的花费成正比例关系,但是系数较小。

    插入的条数和插入时间的花费也成正比例关系,系数大约为2(这些数据比较容易让人理解)。

     


    本想使用SQL2008、MYsql等SQL关系型数据库测试数据来比较下。苦于自己脱离这些知识已久,还要花点时间回顾下,现只是提供数据供大家参考下。

  • 相关阅读:
    CentOS7配置VIP
    Linux定时任务crontab命令
    zabbix安装部署
    ansible部署EFK
    Python中参数的冒号与箭头表示注释
    pycharm 进行远程服务器修改与调试
    判别模型与生成模型
    写Python机器学习时的一些注意事项
    numpy基本操作
    手写神经网络
  • 原文地址:https://www.cnblogs.com/zhuyuxing/p/2640313.html
Copyright © 2020-2023  润新知