大数据-Pagerank-实验报告
目录
大数据-Pagerank-实验报告 1
(1) 概述 1
(2) 数据集分析 1
(3) 程序设计大致流程及关键代码解析 1
(4) 实验结果 19
(5) 实验结果分析 23
(1)概述
语言:C++。
分块:4×4,共16块。
大致过程:读取原始数据wikidata-分块-获取所有网页-初始化PageRank-Map_Reduce执行至收敛-写入数据
(2)数据集分析
①原始数据集wikidata以“[FromNodeID] [ToNodeID]”形式存储,包括了有入度有出度、有入度无出度、有出度无入度等各个类型的结点。
②涉及源网页6110个,所有网页点共7115个。
③数据集较稀疏,结点间联系不太紧密,可知用矩阵存储空间消耗较大。
(3)程序设计大致流程及关键代码解析
1、为【优化稀疏矩阵】,本实验中数据存储使用紧凑表示法(以WebData为类型vector一维数组Data)存储数据。
struct WebData
{
int WebID; //存储源网页号码
int NumOfOut; //存储源网页的出度
vector Target; //存储源网页指向的各个目标网页号码
};
2、Load()函数将wikidata.txt的数据读入以上数组Data中
void load()
{
//打开wikidata.txt
ifstream infile1;
infile1.open("wikidata.txt");
assert(infile1.is_open()); //若失败,则输出错误消息,并终止程序运行
/*————向Data数组内存数据————*/
string s; //存放读取行数据
string blank = " ";
int Web = -1;
vector<int> TemporaryTarget;
while (1)//逐行读取数据
{
getline(infile1, s);
if (s == "") //已经跑到最后了,要把最后一个数据存入
{
WebData save;
save.WebID = Web;
save.NumOfOut = TemporaryTarget.size();
save.Target = TemporaryTarget;
Data.push_back(save);
break;
}
int LocBlack = s.find(blank); //空格所在位置
//获取当前源网页
string NowWeb = s.substr(0, LocBlack);
int Now_Web = stoi(NowWeb);
//如果当前源网页和上一个网页号码不一样,则是新的网页
if (Now_Web != Web)
{
//如果现在Data数组不是空的,对上一个源网页的收尾操作,存入Data中
if (Web != -1)
{
WebData save;
save.WebID = Web;
save.NumOfOut = TemporaryTarget.size();
save.Target = TemporaryTarget;
Data.push_back(save);
}
//对相关数据进行重新初始化
TemporaryTarget.clear();
Web = Now_Web; //更新当前源网页
//向临时目标数组中存入第一个数据
int leng = s.length();
string Tar = s.substr(LocBlack + 1, leng - LocBlack);
int Targ = stoi(Tar); //第一个数据
TemporaryTarget.push_back(Targ); //存入
continue;
}
//如果当前源网页和上一个网页号码一样,则继续对上一个网页的操作
if (Now_Web == Web)
{
int leng = s.length();
string Tar = s.substr(LocBlack + 1, leng - LocBlack);
int Targ = stoi(Tar); //获取目标网页的号码
TemporaryTarget.push_back(Targ); //存入
continue;
}
}
infile1.close();
}




