求救:关于std::bad_alloc

leiucky 2013-03-05 04:34:24
在做一个工程,需要读入一个比较大的文件
文件格式是:
userID1:friendID1,friendID2,.............
userID2:friendID1,.........
.
.
.
我的目标是建立一个数据结构来表示:user-friend-权重
由于后面还需要查找等操作,所以我选择了Map容器
结构是:map<string,map<string,double>>

代码见最后
当我读入的文件比较小时(比如我只读入文件的前100行),则程序完全正确
但是当我完整读入文件时就会发生错误:
文件总行数为75000行左右,我设定读入70000行
读取文件部分正确,但是后面建立用户关系的循环有问题,当循环到3000次左右(即读取完成vec_temp3000行)时系统就抛出错误:unhandled exception: std::bad_alloc at memory location 0x0024f180

求问是怎么回事呀?
内存不够么?那怎么办?

代码如下

int confriend(std::map<std::string,map<std::string,double>>& FriCon )
{
ifstream in(contacts_file);
if(!in)
{
cout<<"can't open the Contacts.txt"<<endl;
system("pause");
return 1;
}
vector<string> vec_temp;
string temp;
int raw = 1;//读取到第几行
while(getline(in,temp))
{
vec_temp.push_back(temp);
raw++;
if(raw>upread_contacts)
break;
}

in.clear();
in.close();

int count = 0;
string FirUser; //USERID;

double frinum = 0;//统计每个人朋友数之和
int everyfri = 0;//统计个人的朋友数

//开始建立用户关系
for(vector<string>::iterator it = vec_temp.begin();it!= vec_temp.end();it++)
{
everyfri = 0;

int j = -1;
count = 0;

for(string::size_type i = 0;i!=it->size();i++)
{
if(everyfri>upnum_everyfri) //每个人朋友上限为200
break;

if((*it)[i] == ',' || (*it)[i] == ':'||i==it->size()-1)
{
if ((*it)[i] == ':') //若是冒号,则代表主用户
{
temp = it->substr(j+1,count);
FirUser = temp; //存储头用户
j = i;
count = 0;
continue;
}
else //否则为主用户的朋友
if (i==it->size()-1)
{
everyfri++;
frinum++;
count++;
temp = it->substr(j+1,count);
FriCon[FirUser][temp] = 0;
j = i;
count = 0;
continue;
}
else
{
everyfri++;
frinum++;
temp = it->substr(j+1,count);
FriCon[FirUser][temp] = 0;
j = i;
count = 0;
continue;
}
}
count++ ;
}
}


return 0;
}


...全文
284 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
leiucky 2013-03-05
  • 打赏
  • 举报
回复
另外,问下,让一个Intel Xeon E5620的服务器进行两百亿次循环靠不靠谱?大概要多久?
leiucky 2013-03-05
  • 打赏
  • 举报
回复
引用 4 楼 sduxiaoxiang 的回复:
引用 3 楼 leiucky 的回复:补充,可能不是内存不够的问题,我发现无论我读入多少行源文件,只要当第二个循环次数达到3000多次时都会抛出那个错误 断点调试呗
电脑比较挫,当循环3000多次时,断点调试,就卡的不行。。。。。。。。
sduxiaoxiang 2013-03-05
  • 打赏
  • 举报
回复
引用 3 楼 leiucky 的回复:
补充,可能不是内存不够的问题,我发现无论我读入多少行源文件,只要当第二个循环次数达到3000多次时都会抛出那个错误
断点调试呗
leiucky 2013-03-05
  • 打赏
  • 举报
回复
补充,可能不是内存不够的问题,我发现无论我读入多少行源文件,只要当第二个循环次数达到3000多次时都会抛出那个错误
赵4老师 2013-03-05
  • 打赏
  • 举报
回复
仅供参考
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXCHARS 512
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
char PROG[256]="PROG";//程序Program需要的文件列表
char LIST[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int i,c,n,L,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
   return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
   return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
    if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG
    if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST
    if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
    if ((fl=fopen(LIST,"rt"))==NULL) {
        fprintf(stderr,"Can not open %s\n",LIST);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 1;
    }
    if ((fp=fopen(PROG,"rt"))==NULL) {
        fclose(fl);
        fprintf(stderr,"Can not open %s\n",PROG);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 2;
    }
    buf=(char *)malloc(MAXLINES*MAXCHARS);
    if (NULL==buf) {
        fclose(fl);
        fclose(fp);
        fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
        return 4;
    }
    n=0;
    hh=0;
    i=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fl)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);
            while (1) {
                c=fgetc(fl);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            strcpy(buf+i,ln);i+=MAXCHARS;
            n++;
            if (n>=MAXLINES) {
                MAXLINES2=MAXLINES*2;
                if (MAXLINES2==1280000) MAXLINES2=2500000;
                buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
                if (NULL==buf2) {
                    free(buf);
                    fclose(fl);
                    fclose(fp);
                    fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
                    return 5;
                }
                buf=buf2;
                MAXLINES=MAXLINES2;
            }
        }
    }
    fclose(fl);
    if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
    else qsort(buf,n,MAXCHARS,compare);
    hh=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fp)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);
            while (1) {
                c=fgetc(fp);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            if (ignore_case) {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
            } else {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
            }
        }
    }
    fclose(fp);
    free(buf);
    return 0;
}
leiucky 2013-03-05
  • 打赏
  • 举报
回复
有人能帮我看下么~~~~

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧