• C++ 对TXT 的串并行读写


    任务说明:有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 ...
      ");
      
       
      
          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 ...
    ");
    #pragma omp parallel for num_threads(4)
    	for (d = 1; d < 361; d++){
    		printf("Hello world, I am %d, docs index %d.
    ",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对串行读取的速度并没有太多提升,反而是当进程数多于系统物理核数的时候,程序时间会加长。

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

  • 相关阅读:
    当今优质男人的硬指标15条
    真正爱你的男人
    二十条人生建议
    女孩嫁人前先看看这十句话
    MM拒绝GG求爱的几种方法
    让你受用一生的爱情经典
    男女朋友们的经典称呼
    一道终身受用的测试题
    爱情,你在哪里?
    经典短篇:女人心疼男人的10种方式
  • 原文地址:https://www.cnblogs.com/simayuhe/p/7208393.html
Copyright © 2020-2023  润新知