基于map的海量数据归类

7 篇文章 0 订阅

背景:

有大概5000万条的数据,每条数据都是以json格式进行存储,每条数据中有多个字段,需要按照id字段将各个数据进行归类。

方案:

采用map<int, vector<string> > 存储id和该id类别下面的数据。

步骤:

先逐行读取文件,并进行json解析,存储想要提取的字段信息。根据id进行分类。如果该数据的id存在,则进行push操作,否则在新的id下面进行赋值。

为方便结果的展示,本文将归类好的结果,以json形式进行组织。



代码如下:

    string filename = "/data1/kgops/data/AudioFileSub.txt";//save the fulldata
    ifstream infile(filename.c_str());
    string oneline;
    uint32_t linecount = 0;
    map<int, vector<string> > *MusicMap = new map<int, vector<string> >;//建立在堆上
    map<string, int> *TimeMap = new map<string, int>;//建立在堆上
    cout<<"start read data:"<<endl;
    int count=0;
    int totalcount=0;
    while(getline(infile, oneline))
    {
        linecount++;
        Json::Reader reader;
        Json::Value jsData;
        if(!reader.parse(oneline, jsData))
        {
            LogTrace(WarnLevel, "parse json-data failed! line: %u", linecount);
            continue;
        }
		string hash32 = jsData["afterData"]["hash"].asString();//获取hash信息
		transform(hash32.begin(),hash32.end(),hash32.begin(), ::tolower);//
		string scid = jsData["afterData"]["id"].asString();//获取id信息
		string timelength = jsData["afterData"]["timelength"].asString();//获取时长信息
		(*TimeMap)[hash32]=atoi(timelength.c_str());//转用int来存储,而非string
		int IntScid = atoi(scid.c_str());//转为int
		uint32_t rowId = 0;
		rowId = optHashMap[hash32];
		if(MusicMap->find(IntScid) != MusicMap->end()) 
		{//已经存在的情况
			(*MusicMap)[IntScid].push_back(hash32);
		}
		else//该scid不存在于map中,则进行插入
		{
			int IntScid = atoi(scid.c_str());//转为int
			vector<string> musicvector;
			musicvector.push_back(hash32);
			(*MusicMap)[IntScid]=musicvector;
		       //建立一个map,存放hash和timelength
		}
		
		
	}
	//直接进行遍历
	map<int, vector<string> >::iterator MusicIter;
	map<string, int>::iterator TimeIter;
	Json::Value ret;
	Json::Value AllRet;
	stop=time(NULL);
	cout<<"Cost:"<<(stop-start)<<endl;
	start=stop;

	for(MusicIter=MusicMap->begin();MusicIter!=MusicMap->end();++MusicIter)
	{
		int len=MusicIter->second.size();
		Json::Value candidates(Json::arrayValue);
		for(int i=0; i<len; ++i)
		{
			//cout<<"key: "<<MusicIter->first <<" value: "<<MusicIter->second[i]<<endl;
			Json::Value item;
			item["scid"]=MusicIter->first;
			item["hash"]=MusicIter->second[i];
			TimeIter=TimeMap->find(MusicIter->second[i]);
			if(TimeIter != TimeMap->end())
			{
				item["timelength"]=TimeIter->second;
			}
			else
			{
				item["timelength"]=0;
			}
			
			if(!item.isNull())
			{
				candidates.append(item);
			}
			
		}
		int IntScid=MusicIter->first;
		char buff[20];
		memset(buff,0,sizeof(buff));
		snprintf(buff,sizeof(buff),"%d",IntScid);
		string str;
		str=buff;
		ret[str] = candidates;
	}
	delete MusicMap;
	delete TimeMap;
	AllRet["scid"]=ret;
	
	//转为json
	Json::FastWriter fast;  
	// cout<<fast.write(ret)<<endl;  
        Json::StyledWriter styled_writer;//另一种格式化的方式,输出结果的格式不一样  
       //cout << styled_writer.write(AllRet) <<endl;
	stop=time(NULL);
	cout<<"ALL条数据耗时:"<<(stop-start)<<endl;
	infile.close();


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值