`
ZeaLoVe
  • 浏览: 91713 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

大量数据查重

 
阅读更多

     本来到软工所是为了做作业和看书的,结果,很不务正业的被一个问题吸引了,这个任务是:从文件中读入一系列格式化好的数据,如

 

  int           int              int        int     float     float

90900 1442373573 1486014884 0 0.0125 0.0949473

90900 1442373573 1485883012 0 0.0125 0.0945844

90900 836615420 1488523911 2 0.0125 0.00650644

90900 1277583173 1488377356 3 0.0125 0.089611

90900 598391375 1488217313 2 0.0125 0.00790251

90900 1277583173 1306110622 3 0.0125 0.10079

90900 1277583173 1294971886 3 0.0125 0.0947241     


     然后以某个数据为Key进行查重(一看发现第一排都一样),思路其实相当简单,在输入数据的时候构建Hash表或者树形查找结构(直接使用STL的Set或者Map即可)数据量很大,大约150M以上的数据。 所以其实最大的问题在于怎么做文件操作才可以尽可能快的完成,考虑到150M内存放的下,而传统的一次读取一个数据或者一次一行的操作都要频繁的IO操作,性能必然达不到要求,所以需要一次性将整个文件读入内存,然后再对内存中的格式化数据进行处理。

     格式化读入数据我用的是sscanf不知道C++有没其他好的方法,至少我感觉同时使用C++的IO库和C的库是件非常蛋疼的事情,经常会发生各种莫名其妙的错误,还是少用为好。但C++标准的IO库的效率实在是。。。如果不优化绝对满足不了要求的。以前搞ACM的时候的教条,如果你不想TimeOut,那就不要用cin,cout。学学Scanf和Printf吧,少年。记忆尤深啊。


     如果内存限制的情况就是尽可能的分割块来求解了,如果仅仅是查重的话,说明重复的数量必然不大,查重的数据结构可以常驻内存。只需要把IO读写的操作考虑清楚就OK了。


    在string 的substr上面纠结了很久,因为我的印象中是传入两个参数,一个是开始索引,另一个是结束的。。所以该函数的行为让我很不解,后面一调试发觉不对劲,结果查了下,才发现居然第二个参数是截取的字符数。。。记性不好啊。。确实应该多写才行,string 处理在大三暑假做课程设计时候经常用的,两年多了就忘的差不多了。


不多扯了,代码如下:

 

 

#include<vector>
#include <string>
#include <fstream>
#include<iostream>
#include <set>
using namespace std;
//the google data structure
struct Data
{
	int Time;
	int JobID;
	int TaskID;
	int JobType;
	float NrmlTaskCore;
	float NrmlTaskMem;
};
//Store the data into a vector
typedef vector<Data> google_data;

void initData(const string& s_data, google_data& t_data)
{
	//cout<<"init"<<endl;
	string line;
	long index = 0;             //记录目前s_data读取的位置
	long lineStart;
	long fileSize = s_data.size();
	Data tmp;
	set<int> jobSet;
	set<int> taskSet;
	index = s_data.find_first_of(char(10), index);
	++index;
	while(index<=fileSize)    //防止溢出
	{
		lineStart = index;
		index = s_data.find_first_of(char(10), index);
		if(index==-1)            //真正结束循环的地方
			break;
		//解析string,存为六个字段
		line = s_data.substr(lineStart, index-lineStart);
		sscanf(line.c_str(), "%d %d %d %d %f %f", &tmp.Time,&tmp.JobID, &tmp.TaskID, &tmp.JobType, &tmp.NrmlTaskCore,&tmp.NrmlTaskMem);
		t_data.push_back(tmp);
		index +=1;
	}
	cout<<"The total lines:"<<t_data.size()<<endl;
	//遍历解析后的数据,去除重复的jobID和taskID
	google_data::iterator itr = t_data.begin();
	while(itr != t_data.end())
	{
		jobSet.insert((*itr).JobID);
		taskSet.insert((*itr).TaskID);
		itr++;
	}
	cout<<"The unique jobs :"<<jobSet.size()<<endl;
	cout<<"The unique tasks:"<<taskSet.size()<<endl;
}

char * readFile(const char* filename)
{
	//cout<<"begin reading..."<<endl;
	filebuf *pbuf;
	ifstream filestr;
	long size;
	char *buffer;
	//要读入整个文件,必须采用二进制打开
	filestr.open(filename, ios::binary);
	//获取filestr对应buffer对象的指针
	pbuf = filestr.rdbuf();
	//调用buffer对象方法获取文件大小
	size = pbuf->pubseekoff(0, ios::end, ios::in);
	pbuf->pubseekpos(0, ios::in);
	//分配内存空间
	buffer = new char[size];
	//获取文件内容
	pbuf->sgetn(buffer, size);
	filestr.close();
	return buffer;
}

int main()
{
	google_data t_data;
	//cout<<"read file"<<endl;
	char* buf = readFile(".//google-cluster-data-1.csv");
	//将读入文件以字符串形式存入fileData中
	string fileData(buf);
	cout<<"start computing, please wait about more than 1 minutes..."<<endl;
	//核心, 处理数据(解析,计算出某个字段的不重复总数)
	initData(fileData, t_data);
	//cout<<"end of sparse.."<<endl;
//	system("pause");
	return 0;
}
分享到:
评论

相关推荐

    thinkphp5-使用SimHash进行海量内容数据查重

    在IT行业中,尤其是在大数据处理和搜索引擎优化的领域,内容查重是一个重要的问题。ThinkPHP5是一个流行的PHP框架,它提供了丰富的功能和工具来帮助开发者构建高效的应用程序。本篇文章将详细探讨如何在ThinkPHP5中...

    基于大数据挖掘的科技项目查重模型研究.pdf

    大数据挖掘是一种从大量、复杂、多样化的数据集中提取有价值信息的过程,它能够发现数据间潜在的关联关系和模式。在科技项目查重领域,大数据挖掘技术可以帮助研究人员整合科技项目的基本信息、发表论文信息、关键词...

    售前必备,标书查重工具

    标书查重工具通过比对大量的已有标书数据,能够有效地检测出相似或重复的部分,从而提高标书的质量,增加中标的机会。 首先,我们要理解什么是源码软件。源码软件是指提供原始编程代码的软件,用户可以查看、修改和...

    论文查重软件.zip

    查重软件通过比对大量的文献数据库,查找与提交的论文相似或相同的内容。它通常采用先进的文本比对算法,如N-gram、TF-IDF等,来计算论文中每个句子或段落与其他文献的相似度。一旦发现相似度超过预设阈值,软件会...

    java文本查重工具类封装

    而平衡二叉树,如AVL树或红黑树,保证了树的高度平衡,从而在插入、删除和查找操作上达到较高的效率,尤其适合于大量数据的快速查重。 总的来说,这个Java文本查重工具利用了多种设计模式和算法,旨在提供高效且...

    航天信息电子发票查重系统

    1. 高效查重:利用高效的数据匹配算法,可以在大量发票数据中快速找出重复项,大大提高了工作效率。 2. 大数据支持:系统具备处理大规模数据的能力,无论是小型企业还是大型集团,都能满足其电子发票的查重需求。 3....

    分词与查重软件

    查重软件通过比对大量数据库,找出相似或相同的文本段落,从而判断是否存在抄袭或剽窃行为。查重算法通常基于TF-IDF、余弦相似度等统计方法,或者更先进的深度学习模型,能够高效地在海量数据中找出潜在的重复内容。...

    免费查重软件.zip

    2. **论文查重原理**:查重软件通过对比用户提交的论文与大量的文献数据库,找出相似度高的段落。常见的查重算法如N-gram、TF-IDF等,可以计算文本间的相似度。 3. **查重报告**:这款免费软件能导出重复的文档,...

    MySQL 数据查重、去重的实现语句

    本篇文章主要探讨了如何在MySQL中进行数据查重和去重的操作,以确保数据的唯一性和准确性。以下是一些关键知识点: 1. **单字段查重**: 当我们需要查找特定字段(如`nick_name`)上的重复数据时,可以使用`GROUP ...

    网页查重技术在企业数据仓库中的应用

    ### 网页查重技术在企业数据仓库中的应用 #### 一、引言 随着信息技术的迅猛发展,企业越来越依赖于数据驱动的决策过程。数据仓库作为存储和管理大量结构化数据的关键工具,在现代企业管理中扮演着至关重要的角色...

    论文查重软件1.0

    1. **数据索引**:软件内置大量的学术文献库和互联网资源,首先会对这些数据进行索引,形成一个庞大的比对库。 2. **文本分块**:用户提交的论文会被拆分成若干个较小的文本块,如句子或段落。 3. **相似度计算**...

    word文件查重工具

    文件名"查重vba20160507"暗示这个查重工具可能包含VBA宏,这些宏可能用于实现文档处理、数据提取和比对等功能。VBA宏的使用使得工具更加灵活和可定制,用户可以根据需要调整或扩展其功能。 总的来说,"Word文件查重...

    亲测可用word文档查重.zip

    首先,查重的基本原理是通过对比文档中的句子或段落与大量的已知文本库进行匹配,寻找相似度高的内容。这通常涉及到自然语言处理(NLP)和文本挖掘技术,如分词、TF-IDF(词频-逆文档频率)计算、余弦相似性等算法。...

    降低论文查重率

    查重工具通过对比大量的文献数据库,找出与待检测论文相似的文本,并计算出重复率。降低论文查重率则是作者在提交论文前必须关注的问题,因为过高重复率可能导致论文被拒或影响作者的学术声誉。 标题“降低论文查重...

    毕业论文 查重稿.zip

    2. **中国知网CNKI查重**:国内高校普遍使用的查重系统,特别适合中文论文,覆盖了大量的中文期刊和学位论文。 3. **万方查重**:另一款国内知名的查重工具,拥有丰富的中文资源库。 4. **PaperPass**:提供快速...

    论文查重.zip

    确保选择的查重工具不会泄露用户的论文内容,且应遵循合理的数据处理和隐私政策。 毕业论文是学术生涯的一个重要里程碑,它要求学生综合运用所学知识,进行独立研究,并以书面形式呈现。查重不仅有助于避免抄袭,还...

    网页查重算法调查报告

    网页查重是一个重要的技术,旨在解决互联网上大量重复和相似信息的问题。随着互联网的快速发展,信息爆炸性增长,搜索引擎在处理这些海量数据时面临挑战。重复网页不仅降低了搜索效率,还浪费了存储资源。因此,查重...

    论文查重工具及修改工具

    - 快速检测:在短时间内完成大量文本的比对工作,节省用户时间。 - 安全保障:确保用户数据的安全,不会泄露用户的论文内容。 总的来说,正确使用论文查重工具并进行有效修改,是提升论文质量、维护学术诚信的重要...

    论文查重软件

    1. 数据隐私:在使用查重软件时,要注意保护个人隐私和论文内容的安全,确保所选软件有良好的数据保护措施。 2. 正确解读结果:查重软件并非绝对权威,可能存在误判。因此,作者需结合人工审阅来评估结果的准确性。 ...

Global site tag (gtag.js) - Google Analytics