您的位置:首页 > 其它

基于map的海量数据归类

2016-01-05 18:10 302 查看
背景:

有大概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();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: