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关系型数据库测试数据来比较下。苦于自己脱离这些知识已久,还要花点时间回顾下,现只是提供数据供大家参考下。

原文地址:https://www.cnblogs.com/zhuyuxing/p/2640313.html