超大文本文件单词频数统计

一、实验目的:

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

二、实验环境:

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/52988.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于微软输入法输入特殊符号的方法

偶尔看了一下julia编程语言的Documentation其中有一个整除符号“”和“⊻”这个异或符号&#xff0c;于是寻找这些特殊符号的键盘输出方法&#xff0c;找到了微软输入法输入特殊符号的一些方法&#xff0c;记录如下&#xff1a; 一、右键单击输入法栏&#xff1a; 二、选择设…

微软输入法和搜狗输入法中的双拼

双拼真是一个好东西。下面简单讲讲小鹤双拼在搜狗输入法和微软输入法里面的使用。 在搜狗输入法里面&#xff0c;启用小鹤双拼很方便&#xff0c;直接打开搜狗的属性设置&#xff0c;在 常用 选项卡里面的输入习惯中可选中双拼方案&#xff0c;点击双拼方案设定可指定特定的双…

解决wine tim/wechat不支持搜狗输入法

QQ:https://im.qq.com/linuxqq/download.html 参考https://blog.csdn.net/Victor_zero/article/details/80554060 查看桌面图标属性&#xff0c;找到命令&#xff0c;有一个run.sh的文件路径 加上下面三句 export XMODIFIERS"imfcitx" export GTK_IM_MODULE"…

微软内置输入法使用指南

这两个模式挺好用的 U模式输入(中文模式下输u) 之后你就可以用下图上的各种功能啦 笔画拆分笔画拆分混合符号 例如&#xff1a;ushuishuishui **V模式输入**(中文模式下输v) 之后你就可以用下图上的各种功能啦 ![v](https://img-blog.csdnimg.cn/20201101170502942.png#pic_…

输入法出现异常???输入英文字母分隔很大???你真的会使用输入法了吗???如何高效使用输入法???微软自带输入法切换

序言&#xff1a;相信很多小伙伴使用输入法时会遇到一些问题&#xff1a;输入字母的时候不知道按了什么键导致&#xff0c;输入字母的分隔很大&#xff0c;原本输入的是abc&#xff0c;现在是&#xff41;&#xff42;&#xff43;&#xff0c;还以为是系统故障。 原因&#x…

win10,win11微软输入法如何导入搜狗词库的方法-词库转换

很多人使用PC输入法越来越喜欢简洁好用的&#xff0c;搜狗、百度这种输入法的臃肿和广告弹窗越来越让我们感到烦闷&#xff0c;于是很多人开始选择使用Windows系统自带的微软拼音输入法。 微软拼音输入法其实在日常使用中已经足够用了&#xff0c;不过词库一直是被使用者诟病的…

Windows 输入法在注册表中的管理

Windows 输入法在注册表中的管理 查看语言栏的输入法法一法二 查看默认输入法找到默认输入法的 CLSID根据 CLSID 查找对应的输入法 WINDOWS下输入法中英文切换 切换输入法半角全角(打开关闭输入法) 输入法的注册、安装和卸载 Win10微软拼音输入法设置-注册表 Text Services Fra…

WIN11自带微软输入法设置问题 自带键盘版本仍为win10问题、显示繁体问题解决

&#x1f6a9; 看了win11的自带系统键盘 十分简约方便 感觉挺好用 虽然更新到了win11但是默认系统键盘还是win10 在系统设置里不断寻找终于找到了解决方法 解决方法 设置》时间和语言》语言和区域》点击中文&#xff08;简体&#xff0c;中国&#xff09;右边三个点》点击语…

windows 11 使用 之 关闭Windows自带输入法简繁切换(Ctrl+Shift+F)

windows 下使用 IDEA 时&#xff0c;全局查找快捷键与windows下的简繁切换冲突&#xff0c;照成在中文输入发下&#xff0c;CtrlShiftF 为简繁切换&#xff0c;而英文状态下为全局查找。所以需要关闭Windows自带输入法繁体简体切换&#xff08;CtrlShiftF&#xff09;的热键来达…

微软输入法设置小鹤双拼

微软默认自带的双拼只有三种&#xff0c;其中没有小鹤双拼&#xff0c;可以通过以下三步来加入小鹤双拼&#xff0c;不需要自己一个个的修改按键。 1.winR 输入 regedit&#xff0c;打开注册表 2 找到 HKEY_CURRENT_USER\Software\Microsoft\InputMethod\Settings\CHS 3 新建…

WindowsServer域用户下微软输入法不能键入简体 (中文)

Windows Server 2016关于域用户下微软中文输入法不能键入简体 (中文) 前言 系统中添加了微软中文输入法后&#xff0c;键入中文拼音&#xff0c;不显示候选汉字栏&#xff0c;按空格键直接变成拼音英文。 经过了一番尝试和查阅资料终于找到了解决方案&#xff0c;分享并保存…

微软拼音 输入法 个人 偏好设置

如何设置微软拼音?答:设置->时间和语言->语言->首选语言->点击"中文(中华人民共和国)"->选项->键盘->添加键盘 如何设置快速输入当前时间? 答:用户自定义短语: 添加->sj 格式%yyyy%-%MM%-%dd% %HH%:%mm%:%ss% 其他设置备忘: 1.关闭繁体…

微软输入法怎么打开软键盘?

在使用电脑的过程中&#xff0c;难免会遇到外接键盘设备失灵&#xff0c;打不了字的情况&#xff0c;这时候可以开启软键盘来应急。那么微软输入法如何调出软键盘呢&#xff1f;下面就来看看详细的步骤。 具体方法&#xff1a; 第一步&#xff0c;我们在左下角的“微软视窗”按…

美团大佬创业,要做中国的OpenAI!顶级VC认购2.3亿美元,75%股份用来招募人才...

来源丨新智元 编辑丨Aeneas 点击进入—>3D视觉工坊学习交流群 【导读】美团大佬王慧文今日又发英雄榜&#xff0c;表示新公司已得VC认购2.3亿美元&#xff0c;其中75%股份&#xff0c;用于招募AI顶级人才。 这两天&#xff0c;大家的社交网络都被「美团大佬自掏5000万美元入…

黑马程序员c++讲义课件笔记

黑马程序员c讲义课件笔记 基础https://blog.csdn.net/ClaireSy/article/details/108422945 &#xff08;或https://blog.csdn.net/m0_37882192/article/details/109103335) 核心https://blog.csdn.net/ClaireSy/article/details/108423047 提高https://blog.csdn.net/ClaireSy/…

腾讯新版 Windows QQ 首个公测版发布,采用全新 QQ NT 架构

3 月 24 日消息&#xff0c;按照此前的公告&#xff0c;腾讯新版 Windows QQ 首个公测版于今日正式发布&#xff0c;面向报名公测的用户开放下载。 全新 Windows QQ 基于 QQ NT 架构开发&#xff0c;首个公测版的版本号为 9.8.0.11111&#xff0c;默认采用扫码登录方式&#xf…

想创业不知道做什么好?尝试从这几个方面入手试试

很多人想创业&#xff0c;但不知道自己能干什么&#xff0c;应该怎么去创业&#xff1f;创业并不是心血来潮的事情&#xff0c;而是经过长时间的沉淀和经验的累积才找到属于自己的道路&#xff0c;每个人都想多挣钱&#xff0c;都想靠自己的努力去拼搏&#xff0c;这里小编就给…

我是技术男,也曾创业过,也拿过风投......

作者 | 王晔倞 本文经授权转载自吃草的罗汉&#xff08;ID&#xff1a;kidd_wyl&#xff09; 在技术圈&#xff0c;有个很有意思的现象。似乎那些计算机高手要么高学历&#xff0c;要么学历很低。 先说说高学历的&#xff0c;像清华或交大计算机系毕业的高材生&#xff0c;无…

一个想法照进现实-《IT连》创业项目:创业时该不该用新手程序员

前言&#xff1a; 距离上一篇文章&#xff0c;转眼已然一个多月了&#xff0c;这段时间没出来和大伙汇报创业的进度&#xff0c;怪我了。 最近又感冒了&#xff0c;已经一个多星期了&#xff0c;还在感冒中&#xff0c;不过感冒也不能偷懒了&#xff0c;每天都有大把的事情等着…

如何使用报表工具制作统计报表

说明&#xff1a;数据集中有很多分组&#xff0c;那么分组的数据如何在报表中进行统计。本次以购货单信息表按照分组报表制作之后&#xff0c;进行统计&#xff0c;效果如下&#xff1a; 步骤一&#xff1a;添加数据源 点击数据源区&#xff0c;在弹出来的数据集语句获取窗口中…