跨线程拆分文本文件

时间:2012-12-08 17:02:32

标签: c file pthreads distributed

问题:我有几个文本文件(10),每行都有数字。我需要将它们拆分为我使用pthread库创建的一些线程。创建的这些线程(工作线程)将查找发送给它们的最大素数(以及所有文本文件中的所有最大素数)。

我目前对解决方案的想法:我在想自己有两个数组和所有文本文件在一个数组中,另一个数组将包含一个二进制文件,我可以读取1000行并将指针发送到索引包含id,文件指针和文件位置的结构中的二进制文件,让它通过它。

我正在谈论的一点点:

pthread_create(&threads[index],NULL,workerThread,(void *)threadFields[index]);//Pass struct to each worker

STRUCT:

typedef struct threadFields{
  int *id, *position;
  FILE *Fin;
}tField;

如果有人有任何见解或更好的解决方案,我们将不胜感激

编辑: 好的,所以我找到了解决问题的方法,我相信它与SaveTheRbtz的建议类似。这是我实施的: 我把文件合并到1个二进制文件中并在循环中保持它的大头钉(我必须考虑每个条目的字节数,这是硬编码的)

struct threadFields *info = threadStruct;
  int index;
  int id = info->id;
  unsigned int currentNum = 0;
  int Seek = info->StartPos;
  unsigned int localLargestPrime = 0;
  char *buffer = malloc(50);
  int isPrime = 0;

    while(Seek<info->EndPos){
    for(index = 0; index < 1000; index++){//Loop 1000 times
    fseek(fileOut,Seek*sizeof(char)*20, SEEK_SET);
    fgets(buffer,20,fileOut);
    Seek++;
    currentNum = atoi(buffer);
    if(currentNum>localLargestPrime && currentNum > 0){
      isPrime = ChkPrim(currentNum);
      if( isPrime == 1)
        localLargestPrime = currentNum;
    }
  }

2 个答案:

答案 0 :(得分:1)

你能做十个线程,每个线程处理一个指定为参数的文件。每个线程将读取自己的文件,检查该值是否大于它到目前为止记录的最大素数,如果是,则检查新数字是否为素数。然后,当它完成时,它可以将prime返回到协调器线程。协调器线程后退并等待线程完成,从每个线程收集最大的素数,并且只保留最大的素数。您可以使用0作为标记值来表示“尚未找到素数”。

  

假设我想要11个线程而不是10个线程;那我怎么分工呢?

我马上就有第11个帖子pthread_exit()。如果你想为自己制定协调问题,你可以,但为什么要让生活变得更加艰难。

如果你绝对必须有11个线程处理10个文件并分配工作,那么我想我最初可能会在队列中设置10个文件流。线程将在条件'队列非空'上等待以获得文件流(互斥和条件以及所有这些)。当线程获取文件流时,它将从文件读取一个数字并将流推回队列(信令队列不为空),然后处理该数字。在EOF上,线程将关闭文件而不将其推回队列(因此​​线程必须检测'没有未读数据的文件流')。这意味着每个线程将读取大约十一个数据,具体取决于主要计算对其实际读取的数字所花费的时间。代码比每个文件解决方案的简单一个线程要复杂得多,但它会(或多或少)扩展到任意数量的线程和文件。特别是,它可以用来让7个线程处理10个文件,并且有17个线程处理10个文件。

答案 1 :(得分:0)

看起来像邮件队列的作业:

  1. 将数据拆分为块的“供应商”线程集 然后把它放到队列中。在您的情况下,块可以用文件名或表示 (fd,offset,size)元组。为简单起见,可以有一个这样的 供应商。
  2. 从输入中提取数据的“worker”线程数 队列,处理它并将结果放到另一个队列。为了表现 通常有很多工人的原因,例如,如果你的任务是 CPU密集型然后sysconf(_SC_NPROCESSORS_ONLN)应该是好的 选择。
  3. 一个“聚合器”线程,将结果队列“减少”为单个值。对于您的情况,它是简单的max()函数。
  4. 这是一种高度可扩展的解决方案,使您能够轻松地将多种不同类型的处理阶段组合成易于理解的管道。