我现在想存储150w个我创建的对象(这个地方不能降低数据的),该用什么样的容器
我现在用的是vector<class> 这里不是放的指针,但效果不好,用了大约400M的内存
但我看一些市面上一些比较好的软件,做同样的事,内存大约120M

解决方案 »

  1.   

    尽量用指针,而不是对象
    如果需要遍历、查找,还是用stl比较好
      

  2.   

    存储对象指针 vector<Object*> 移动拷贝的代价都是4字节。
      

  3.   


    //这是我要存储的对象
    class CAction
    {
    public:
     INT actionType;
     SqStack<Point,2,4> moveList;//这里的长度不固定,此栈我自己用模板做的
     bool LPC;
     UINT apertureNum;
     bool isathwart;
    public:
       //当然了,这里还有些函数我现在需要一个容器记住它,并且是大量的
      

  4.   

    用boost库 把
    vector<  shared_ptr<class> >vector里面原则上不能放入 一个大数据的实例,而只能放入指针,因为vector的内容是顺序排列的,如果放入实例,插入删除的开销太高或者用list<class>  另外我很好奇:不管用什么容器,150w的数据占用的内存难道会不同么
      

  5.   

    vector先reserve,然后再存放,这么多数据应该考虑存放一些索引等信息来降低数据大小
      

  6.   

    SqStack<Point,2,4> moveList;
    这个用指针,在堆上分配
    容器应该就可以用对象指针了作为元素了
      

  7.   

    如果你非常关心的是内存,那内就要考虑成员变量的类型了:
    class CAction
    {
    public:
     INT actionType;//可否用unsigned short actionType?甚至char?
     UINT apertureNum;//可否用unsigned short apertureNum
     bool LPC;//可否与isathwart,合用一个char,那么你程序中就需要用bit运算分解。
     bool isathwart;
     //上面四个数据能否加起来只用4byte,否则数据对齐会增加不少内存。
     SqStack<Point,2,4> moveList;//
     public:
      

  8.   

    楼上的说到我心坎上料,楼上的可以先给50分但我还想说的,vecotr不是自动扩充空间的嘛,越是后面,一下子给空间非常大,
    所以我就想,我的内存这么爆满,是否是最后的空间剩余太多,如果我牺牲下效率手动分配是否会有问题我这样的数据结构,一般一个vector中有19W个这样的对象,这样的vector有很多,一般总和超过150w另外我在这样的结构中创建函数,是否会对内存有影响。我对这方面了解不是很多,如果我在这里主动干扰虚拟
    内存,比喻降低实际内存,提高物理内存,是否会有影响
      

  9.   

    恩是这样的,我已经遇到了CPU长时间被占用了。新的效率问题出现了,内存我按照上几楼的说法,试了下确实这样的。
      

  10.   

    但我还想说的,vecotr不是自动扩充空间的嘛,越是后面,一下子给空间非常大,
    所以我就想,我的内存这么爆满,是否是最后的空间剩余太多,如果我牺牲下效率手动分配是否会有问题如果你能预先确定vecotr的大小,先用reverse保留适当的空间,比如你估计有185000,你给reverse(185000),不够部分自动扩充空间也是可以的。应该效率更高。
    完全临时自动扩充空间效率应该不高。另外我在这样的结构中创建函数,是否会对内存有影响。
    在结构中创建函数与全局函数对内存印象没什么区别。一旦使用虚拟内存,速度就会下降非常大。一个vector中有19W,这样的vector有很多,一般总和超过150w。
    你的总和怎么计算出来的?多个vector的数据是否可以不同时读进内存,需要时读进数据?你可以看看内存映射,读数据会非常快,读100m要不了多少时间。
      

  11.   

    关于C++的 集合类使用情况不是很清楚,做过的数据量没有这么大.以前用JAVA的时候,我看过    <<分布式JAVA应用>>  林昊写的   淘宝架构师上面有各种常用集合类的效率测试,很具体.c++方面不太清楚有没有这样的书.你可以找找看,也许会有思路vector  array   map 等
      

  12.   

    我的数据大都来源于很多gerber文件(PCB文件),我要从中抽取我要的信息。一般一个gerber文件有3M-6M,这样的文件有6-9个这么个数。不光如此,我还要在这些文件解析之间进行大量的循环的运算(如,计算圆,多边形等图形的顶点数据)。通过上述数据,画出pCB板子的图形现在我听取这么多人的意见,修改了下代码,19W个对象现在也就20M的内存,降是降低了,但如果再降低到10M的内存,我看和市面上流行的软件差不多了。此外效率问题又出现了,一个3M的文件连解析带画出来得30秒,而一些比较高端的软件做同样的事5秒就搞定。我用排除法一一做测试,看到底哪块计算的时间的要的最多。一是我的字符串截取(什么也不做,只是按特定字符截取完就得5秒)
     
      strSrc=strtok_s(strSrc,strDel,&next_s);
      while(strSrc)
      {
      strList.push_back(strSrc);
      strSrc=strtok_s(NULL,strDel,&next_s);
      }
    二是我翻译上面截取的字符串用的公式
    如 str=”X48500Y22500D03“
    XYGDIJ不确定的省略的
    我用下面的函数解析static void ReadXY(CString str,UINT &Gm,double &Xm,double &Ym,double &Im,double &Jm,UINT &Dm,double JDX,double JDY)
    {
    UINT iStartG=0;UINT iStartX=0;UINT iStartY=0;UINT iStartI=0;UINT iStartJ=0;UINT iStartD=0;
    UINT size=str.GetLength()-1;
    UINT i=0;
    for(;i<size;i++)
    {
    switch(str[i])
    {
       case'G':
       iStartG=i+1;
       break;
       case'X':
       iStartX=i+1;
       if (iStartG!=0) {Gm=atoi(str.Mid(iStartG,i-iStartG)); iStartG=-1;}
       else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
       break;
       case'Y':
       iStartY=i+1;
       if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
       else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
       else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
       break;
       case'I':
       iStartI=i+1;
       if (iStartY!=0){Ym=atoi(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;}
       else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
       else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
       else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
       break;
       case'J':
       iStartJ=i+1;
       if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI))*JDX;iStartI=-1;}
       else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;}
       else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
       else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
       else if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD));iStartD=-1;}
       break;
       case'D':
       iStartD=i+1;
       if (iStartJ!=0){Jm=atof(str.Mid(iStartJ,i-iStartJ))*JDY;iStartJ=-1;}
       else if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI))*JDX;iStartI=-1;}
       else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY))*JDY;iStartY=-1;}
       else if (iStartX!=0) {Xm=atof(str.Mid(iStartX,i-iStartX))*JDX;iStartX=-1;}
       else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG));iStartG=-1;}
       break;

    }
    }
       if (iStartD!=0){Dm=atoi(str.Mid(iStartD,i-iStartD+1));iStartD=-1;}
       else if (iStartJ!=0){Jm=atof(str.Mid(iStartJ,i-iStartJ+1))*JDY;iStartJ=-1;}
       else if (iStartI!=0){Im=atof(str.Mid(iStartI,i-iStartI+1))*JDX;iStartI=-1;}
       else if (iStartY!=0){Ym=atof(str.Mid(iStartY,i-iStartY+1))*JDY;iStartY=-1;}
       else if (iStartX!=0){Xm=atof(str.Mid(iStartX,i-iStartX+1))*JDX;iStartX=-1;}
       else if (iStartG!=0){Gm=atoi(str.Mid(iStartG,i-iStartG+1));iStartG=-1;}
    }
    问题就是就这样子啦,5.1过我就结贴,不管问题能不能解决。感谢所有回答问题的同行,呵呵