超大文本文件单词频数统计
一、实验目的:
调用线程进行超大文本文件单词频数统计,测试并讨论不同线程数对代码耗时的影响
二、实验环境:
(1)c/c++,编辑器:Visual Studio与code:blocks;(2)python,编辑器:pycharm
三、实验说明:
通过在pycharm上编写代码(makefile.py)生成1G大小的单词文件(small_file)并生成各单词的数量文件(result.txt),再编写c++代码不同数目的线程统计单词数量的耗时并与result.txt进行对比判断结果是否正确。
四、实验代码:
见cod文件夹
五、实验步骤
(1)编写.py文件
①定义词典与计数器,单词文件里的单词即词典中的单词,计数器统计各单词数量
# 词典
dictionary = ['one ', 'two ', 'three ', 'four ', 'five ', 'big ', 'small ', 'light ']
# 计数器
counter = [0 for i in range(len(dictionary))]
②定义build_file函数,生成1G大小的单词文件
def build_file(file_name):
file = open(file_name, 'w')
file_size = os.path.getsize(file_name)
if file_size <= oneG :
# 文件大小小于1G
while file_size <= oneG:
file.writelines(getWords())
file_size = os.path.getsize(file_name)
③定义getWords()函数,统计各单词数量
def getWords():
list = []
for i in range(random.randint(1, 2)):
index = random.randint(0, len(dictionary) - 1)
counter[index] += 1
list.append(dictionary[index])
list.append('\n')
return list
(2)编写.cpp文件
①定义多线程共享变量dirc_loop和互斥量m
std::vector<std::map<std::string, int>> dirc_loop;
std::mutex m;
②定义getFileSize函数,获得单词文件大小
int getFileSize(std::string file)
{
if (file.empty())
return 0;
struct stat filestat;
if (stat(file.c_str(), &filestat) < 0) {
perror("error: ");
}
return filestat.st_size;
}
③定义fileExist函数,判断单词文件是否存在
int fileExist(std::string file)
{
if (file.empty())
return 0;
struct stat filestat;
if (stat(file.c_str(), &filestat) < 0) {
perror("error: ");
return 0;
}
printf("file exist\n");
return 1;
}
④定义readFile函数,统计各单词数量
int readFile(std::string fileName, size_t file_offsize, size_t end)
{
std::map<std::string, int> dirc;
std::fstream file;
file.open(fileName, std::ios::in);
if (!file.is_open())
return -1;
// 设置文件指针位置
file.seekg(file_offsize, std::ios::beg);
// 查找新的完整单词开始位置
if (file_offsize != 0) {
int last_c = file.seekg(-1, std::ios::cur).get();
if (last_c != ' ' && last_c != '\n') {
while (true) {
int c = file.get();
if (c == ' ' || c == '\n')
break;
}
}
}
printf("read start\n");
// 开始读取
std::string line;
while (file >> line) {
if (dirc.find(line) != dirc.end())
dirc[line] += 1;
else
dirc[line] = 1;
size_t endPos = file.tellg();
if (endPos + 1 >= end)
break;
}
m.lock();
dirc_loop.push_back(dirc);
m.unlock();
return 0;
}
⑤主函数
int main()
{
printf("start\n");
std::fstream file;
std::string fileName = "D:\\PyCharm\\workspace\\Project\\计操\\small_file"; // 文件名
if (!fileExist(fileName))
return 0;
printf("file size: %d\n", getFileSize(fileName));
int parts = 4; //设置线程数
int dater = getFileSize(fileName) / parts;
std::vector<std::thread> t_loop;
auto start_time = std::chrono::system_clock::now();
for (int i = 0; i < parts; i++) t_loop.push_back(std::thread(readFile, fileName, i * dater, (i + 1) * dater));
for (int i = 0; i < parts; i++) t_loop[i].join();
std::cout << "SPENT TIME: " << std::chrono::duration_cast<std::chrono::microseconds>((std::chrono::system_clock::now() - start_time)).count() << " 微秒" << std::endl;
printf("read over\n");
// 汇总结果
for (int i = 0; i < dirc_loop.size(); i++)
{
if (i == 0) continue;
for (auto d : dirc_loop[i]) {
if (dirc_loop[0].find(d.first) != dirc_loop[0].end()) {
dirc_loop[0][d.first] += d.second;
}
else {
dirc_loop[0][d.first] = d.second;
}
}
}
// 输出
for (auto i : dirc_loop[0])
{
printf("%s %d\n", i.first.c_str(), i.second);
}
}
六、结果分析
由此图可以看出,随线程数的增加,程序耗时先减少后增加且不同编译器的耗时相差较大。线程多了可以提高程序并行执行的速度,但是并不是越多越好,其中,每个线程都要占用内存,多线程就意味着更多的内存资源被占用,其二,如果线程太多,cpu必须不断的在各个线程间快回更换执行,线程间的切换无意间消耗了许多时间,所以cpu有效利用率反而是下降的。并且不同的编译器对由源文件经编译生成目标文件,然后经过连接生成可执行文件的优化各不相同,故不同编译器的相同程序耗时不同。最后由于异步性,相同代码的每次执行耗时也略有差异。
超大文本文件单词频数统计相关推荐
- 【文本文件单词数统计】统计《哈姆雷特》作品文本文件中除一些冠词、代词、连接词之外出现最多的单词,打印数量最多的前十个单词
统计是计算科学.管理学.社会学.数学等诸多领域的基本问题,相关问题.方法和技术组成了一门学科,即"统计学" 问题描述如下: 利用python程序统计<哈姆雷特>作品中出 ...
- 统计文章单词频数(C语言)
统计文章单词频数 一.引言 1.1题目概述 1.2题目分析 二.解题过程 2.1 单词存储 2.2 分割字符串 2.3 存放单词 2.4 排序 三.完整代码 四.运行结果 五.总结 一.引言 最近花了 ...
- 程序员面试金典——解题总结: 9.18高难度题 18.5有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离
#include <iostream> #include <stdio.h> #include <vector> #include <string> # ...
- 文本文件单词统计(C语言)
文本文件单词统计(C语言) 本人目前还是一位在校大学生,写文章的目的是为了记录一下当前所学,与其他爱好者或从业者相互学习交流.文本文件单词统计这个题目是学校的一次课程设计中的一道,在编写时也是参考了很 ...
- 题目3:文本文件单词的检索与计数(实验准备)
数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...
- 【学习笔记】C#中HashTable和快速排序的用法,从单词频率统计小程序写起
先瞎扯点别的.进入这个神圣的地方总需要些鞭策,阿西巴,我是被鞭策进来摆摊的程序猿.软件工程老师说,写程序,发博客,就来博客园.这是个号召力很强的口号.最近看网络营销 搜索引擎优化的书多一些,只能说王老 ...
- 个人和结对项目 - 英语单词词频统计
个人或结对编程项目 英语单词词频统计程序 (最新版本在这里) 实现一个命令行程序,支持几种模式下的单词词频统计 Implement a console application to tally the ...
- 《数据结构课程实践》_03_文本文件单词的检索与计数_准备工作
03_文本文件单词的检索与计数_准备工作 一.实验题目与要求 二.编程语言以及开发环境 三.实验思路 1.朴素模式匹配算法 2.KMP算法 四.预习小结 一.实验题目与要求 实验题目: 建立一个文本文 ...
- linux: 多个文件内容(交集,并集,补集,单词个数统计)
原文件如下: 问题如下: 统计两个文件中,单词频数 求出ip 的频数 求出两个文件的交集 求出文件b 和 (文件a 交集 文件b) 的补集 1,统计单词频数 2,统计ip频数 3,求出两个文件的 ...
最新文章
- (转载)浅析Hadoop文件格式
- 一篇文章带你详解 HTTP 协议(上)
- halcon基本,vb,vc连接halcon读取图像,视频
- Deep GSP : 面向多目标优化的工业界广告智能拍卖机制
- 使用Hot Chocolate创建ASP.NET Core GraphQL服务
- PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)
- 女生学UI合适吗?橙色优学告诉你女生UI设计优势
- 快讯!分布式调度项目ElasticJob即将重新起航
- 本人已搬至博客园,感谢CSDN的一路陪伴
- Java电话簿系统超全总结笔记
- Java中如何创建自定义的注解学习笔记(MD版)
- FreeTextBox使用方法
- 人脸对齐算法调研(Face Alignment)
- 计算机操作员初级试题及答案,计算机操作员初级考试试题
- ShareSDK for Android 2022使用步骤
- nyoj 125 盗梦空间
- 报错:mysqld: [ERROR] Found option without preceding group in config file D:\software\mysql-5.7.19-winx
- Mysql之group by 和order by 一起用时的排序问题
- 小程序实现身份证取景框拍摄
- dede mysql query_DedeCMS V5.7版本全文检索功能使用教程
热门文章
- 死磕Lambda表达式(二)
- 《你不知道的 JavaScript》上卷之作用域和闭包
- 微信小程序vant-weapp版本升级更新
- 上海周边学校计算机一本,上海这所211实力很强悍,但因太低调而被忽视,中等生快来捡漏...
- flutter 颜色值处理
- 深度学习笔记:04依赖反向传播改进神经网络数据处理的精确度
- 2020年300分计算机考研能上那个学校,2020考研300分,算高吗?能上研究生吗?后面应该怎么办?...
- 【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)
- 【观察】中建材信息再转型背后,驶入数字化时代新蓝海
- https://developer.apple.com 苹果开发者