研究MongoDB一两个月了,写此文章供大家参考参考。本文如有不足之处还请大师们指出。
1、MongoDB测试程序说明
本文主要测试的是mongodb插入数据的效率。利用的是某老师提供的mongodb二次开发接口。
数据的结构体为:
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。
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、数据结构解析
在测试前,我先讲下一般测试的注意事项。
- 测试最好用台式机并且稳定性较强(通常是散热问题影响较大),不建议使用笔记本。
- 通常有的服务器或者普通台式机因为还在使用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关系型数据库测试数据来比较下。苦于自己脱离这些知识已久,还要花点时间回顾下,现只是提供数据供大家参考下。