一、实验目的:

调用线程进行超大文本文件单词频数统计,测试并讨论不同线程数对代码耗时的影响

二、实验环境:

(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有效利用率反而是下降的。并且不同的编译器对由源文件经编译生成目标文件,然后经过连接生成可执行文件的优化各不相同,故不同编译器的相同程序耗时不同。最后由于异步性,相同代码的每次执行耗时也略有差异。

超大文本文件单词频数统计相关推荐

  1. 【文本文件单词数统计】统计《哈姆雷特》作品文本文件中除一些冠词、代词、连接词之外出现最多的单词,打印数量最多的前十个单词

    统计是计算科学.管理学.社会学.数学等诸多领域的基本问题,相关问题.方法和技术组成了一门学科,即"统计学" 问题描述如下: 利用python程序统计<哈姆雷特>作品中出 ...

  2. 统计文章单词频数(C语言)

    统计文章单词频数 一.引言 1.1题目概述 1.2题目分析 二.解题过程 2.1 单词存储 2.2 分割字符串 2.3 存放单词 2.4 排序 三.完整代码 四.运行结果 五.总结 一.引言 最近花了 ...

  3. 程序员面试金典——解题总结: 9.18高难度题 18.5有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离

    #include <iostream> #include <stdio.h> #include <vector> #include <string> # ...

  4. 文本文件单词统计(C语言)

    文本文件单词统计(C语言) 本人目前还是一位在校大学生,写文章的目的是为了记录一下当前所学,与其他爱好者或从业者相互学习交流.文本文件单词统计这个题目是学校的一次课程设计中的一道,在编写时也是参考了很 ...

  5. 题目3:文本文件单词的检索与计数(实验准备)

    数据结构课程实践系列 题目1:学生成绩档案管理系统(实验准备) 题目2:隐式图的搜索问题(A*算法解决八数码) 题目3:文本文件单词的检索与计数(实验准备) 文章目录 数据结构课程实践系列 题目1:学 ...

  6. 【学习笔记】C#中HashTable和快速排序的用法,从单词频率统计小程序写起

    先瞎扯点别的.进入这个神圣的地方总需要些鞭策,阿西巴,我是被鞭策进来摆摊的程序猿.软件工程老师说,写程序,发博客,就来博客园.这是个号召力很强的口号.最近看网络营销 搜索引擎优化的书多一些,只能说王老 ...

  7. 个人和结对项目 - 英语单词词频统计

    个人或结对编程项目 英语单词词频统计程序 (最新版本在这里) 实现一个命令行程序,支持几种模式下的单词词频统计 Implement a console application to tally the ...

  8. 《数据结构课程实践》_03_文本文件单词的检索与计数_准备工作

    03_文本文件单词的检索与计数_准备工作 一.实验题目与要求 二.编程语言以及开发环境 三.实验思路 1.朴素模式匹配算法 2.KMP算法 四.预习小结 一.实验题目与要求 实验题目: 建立一个文本文 ...

  9. linux: 多个文件内容(交集,并集,补集,单词个数统计)

    原文件如下: 问题如下: 统计两个文件中,单词频数 求出ip 的频数 求出两个文件的交集 求出文件b  和 (文件a  交集  文件b) 的补集 1,统计单词频数 2,统计ip频数 3,求出两个文件的 ...

最新文章

  1. (转载)浅析Hadoop文件格式
  2. 一篇文章带你详解 HTTP 协议(上)
  3. halcon基本,vb,vc连接halcon读取图像,视频
  4. Deep GSP : 面向多目标优化的工业界广告智能拍卖机制
  5. 使用Hot Chocolate创建ASP.NET Core GraphQL服务
  6. PHP字符串中的变量解析(+教你如何在PHP字符串中加入变量)
  7. 女生学UI合适吗?橙色优学告诉你女生UI设计优势
  8. 快讯!分布式调度项目ElasticJob即将重新起航
  9. 本人已搬至博客园,感谢CSDN的一路陪伴
  10. Java电话簿系统超全总结笔记
  11. Java中如何创建自定义的注解学习笔记(MD版)
  12. FreeTextBox使用方法
  13. 人脸对齐算法调研(Face Alignment)
  14. 计算机操作员初级试题及答案,计算机操作员初级考试试题
  15. ShareSDK for Android 2022使用步骤
  16. nyoj 125 盗梦空间
  17. 报错:mysqld: [ERROR] Found option without preceding group in config file D:\software\mysql-5.7.19-winx
  18. Mysql之group by 和order by 一起用时的排序问题
  19. 小程序实现身份证取景框拍摄
  20. dede mysql query_DedeCMS V5.7版本全文检索功能使用教程

热门文章

  1. 死磕Lambda表达式(二)
  2. 《你不知道的 JavaScript》上卷之作用域和闭包
  3. 微信小程序vant-weapp版本升级更新
  4. 上海周边学校计算机一本,上海这所211实力很强悍,但因太低调而被忽视,中等生快来捡漏...
  5. flutter 颜色值处理
  6. 深度学习笔记:04依赖反向传播改进神经网络数据处理的精确度
  7. 2020年300分计算机考研能上那个学校,2020考研300分,算高吗?能上研究生吗?后面应该怎么办?...
  8. 【论文精读】ROC和PR曲线的关系(The relationship between Precision-Recall and ROC curves)
  9. 【观察】中建材信息再转型背后,驶入数字化时代新蓝海
  10. https://developer.apple.com 苹果开发者