任务说明:有36篇文档,现在要读入,并统计词频,字典长度25,希望能够比较串并行读写操作的时间差距。

  1. 串行读入并统计词频
    // LoadDocsInUbuntu.cpp
    
    //
    
    #include <iostream>
    
    #include <stdio.h>
    
    #include <vector>
    
    using namespace std;
    
    int main()
    
    {
    
        char filename[100];
    
        size_t d;
    
        FILE *fileptr;
    
        int word;
    
        vector< vector<int> > corpus;
    
        printf("load data ...\n");
    
        for (d = 1; d < 37; d++){
    
            sprintf(filename, "..//data/doc_%d.txt", d);
    
            fileptr = fopen(filename, "r");
    
            vector<int> doc;
    
            int ff[25] = { 0 };
    
            while (fscanf(fileptr, "%d", &word) != EOF)
    
            {
    
                ff[word - 1] = ff[word - 1] + 1;
    
                doc.push_back(word);
    
            }
    
            corpus.push_back(doc);
    
            fclose(fileptr);
    
            sprintf(filename, "..//result/freqUbuntuSerial_%d.txt", d);
    
            fileptr = fopen(filename, "w");
    
            for (int f = 0; f < 25; f++)
    
            {    
    
                fprintf(fileptr, "%d ", ff[f]);
    
            }
    
            fclose(fileptr);
    
        }
    
        cout <<"corpus.size()="<< corpus.size() << endl;
    
        return 0;
    
    }
    
  2. 这里讨论并行有三种思路:一,按照文档序号进行分组读入统计等操作;二,在文档内按单词数目分组进行统计;三,将统计与读写操作并行处理。

    针对第一种思路,使用openmp做多线程处理:

    

// LoadDocsByOpenMP.cpp
//
#include <omp.h>
#include <iostream>
#include <stdio.h>
#include <vector>
#include <stdlib.h>
#include <time.h>
#include <string>
using namespace std; int main()
{
char filename[100],resultname[100];
int d;
FILE *fileptr[360];
int word;
int ff[360][25] = { 0 };
//vector< vector<int> > corpus;
clock_t start,finish;
int f[360]={0}; start=clock();
printf("load data ...\n");
#pragma omp parallel for num_threads(4)
for (d = 1; d < 361; d++){
printf("Hello world, I am %d, docs index %d.\n",omp_get_thread_num(),d);
sprintf(filename, "..//data/doc_%d.txt", d);
fileptr[d-1] = fopen(filename, "r");
//int ff[25]={0};
////vector<int> doc; while (fscanf(fileptr[d-1], "%d", &word) != EOF)
{
ff[d-1][word - 1] = ff[d-1][word - 1] + 1;
//ff[word-1]=ff[word-1]+1;
// //doc.push_back(word);
}
////corpus.push_back(doc);
fclose(fileptr[d-1]);
sprintf(resultname, "..//result/freqByOpenMP_%d.txt", d);//Be CAREFUL!For the name "filename" has been used before, we must name the string differently here.
fileptr[d-1] = fopen(resultname, "w");
for (f[d-1] = 0; f[d-1] < 25; f[d-1]++)
{ fprintf(fileptr[d-1], "%d ", ff[f[d-1]]);
}
fclose(fileptr[d-1]);
} //cout <<"corpus.size()="<< corpus.size() << endl;
finish=clock();
cout<<"time cost : "<< (double)(finish-start)/ CLOCKS_PER_SEC<<endl;
return 0;
}

但初步比较openmp对串行读取的速度并没有太多提升,反而是当进程数多于系统物理核数的时候,程序时间会加长。

另外两种实现思路在后续学习中继续实现。

最新文章

  1. 卡巴斯基2017激活教程_卡巴斯基2017用授权文件KEY激活的方法
  2. iOS之tabBar随tableView的滑动而隐藏/显现
  3. 张恭庆编《泛函分析讲义》第二章第4节 $Hahn$-$Banach$ 定理习题解答
  4. 【转】HTML5新增元素兼容旧浏览器方法
  5. 分享 Java微信开发SDK
  6. push本地代码到github出错
  7. SPRING IN ACTION 第4版笔记-第二章WIRING BEANS-008-在Java配置文件中引入xml配置文件@Import、@ImportResource
  8. [转载]软件测试之Web测试经典总结
  9. iOS多态 动态绑定
  10. Linux下Apache重启遇到No space left on device错误的解决方法
  11. 【Luogu3807】【模板】卢卡斯定理(数论)
  12. Linux管线命令 - cut,grep,sort,uniq,wc,tee,tr,col,join,paste,expand,split,xargs
  13. sqlilabs 5
  14. libevent库简单使用
  15. 关于Vue.use()使用详解
  16. 《团队-爬虫豆瓣top250项目-团队一阶段互评》
  17. Linux之正则表达式2之()、[]、{}区别
  18. ORB-SLAM2(1) Linux下配置和编译
  19. php预定义字符
  20. java web 手动部署项目步骤

热门文章

  1. 使用easyExcel遇到的坑
  2. 001 Ceph简介
  3. Java程序运行原理
  4. 小小知识点(三十九) 正交频分复用OFDM的基本原理及实现
  5. JavaScript substring()
  6. 别再埋头刷LeetCode之:北美算法面试的题目分类,按类型和规律刷题,事半功倍
  7. Go Web 编程之 静态文件
  8. 使用rabbitmq手动确认消息的,定时获取队列消息实现
  9. HttpServletRequest & HttpServletResponse
  10. Lambda表达式(lambda expression)⭐⭐⭐⭐⭐