基于map的海量数据归类
2016-01-05 18:10
302 查看
背景:
有大概5000万条的数据,每条数据都是以json格式进行存储,每条数据中有多个字段,需要按照id字段将各个数据进行归类。
方案:
采用map<int, vector<string> > 存储id和该id类别下面的数据。
步骤:
先逐行读取文件,并进行json解析,存储想要提取的字段信息。根据id进行分类。如果该数据的id存在,则进行push操作,否则在新的id下面进行赋值。
为方便结果的展示,本文将归类好的结果,以json形式进行组织。
代码如下:
有大概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();
相关文章推荐
- Linux内核中的init_task进程和idle进程
- Peeking Iterator
- Android 使用动态加载框架DL进行插件化开发
- phonegap(cordova) 自定义插件代码篇(四)----读取本地图片
- activemq web console的权限配置
- DELL DEST诊断工具
- 安卓5.0六大最烦人问题与解决方法
- C++如何调试一个DLL类型的工程
- 【JAVA】:java中getTime函数
- 传值选择初始化显示的widget
- JSON 对象处理
- Java并发编程:Callable、Future和FutureTask
- DELL SLI诊断系统
- js中JSON的使用
- Matlab图像彩色转灰色
- 笔记总结大全
- python包的概念
- 通过练习题学习磁盘知识
- Linux命令总结_文件的输入与 输出
- Rxjava 学习之路