使用文件映射和并行处理Linux中的大文件C

时间:2012-04-19 14:06:02

标签: c parallel-processing mpi

我的想法是,每次每个节点映射一个巨大文件的一个块并处理它。然后它将这个块发送出去,然后去找下一个。

但是,我总是在群集(Openmpi)上失败但在我的机器上运行正常(mpich)

映射部分如下: PAGE是一个整数= 4 * 1000 * 1000 //偏移量必须是一个内存页面的次数,即4kb。 ntask是节点的总数 mytask表示当前节点号 所以缓冲区大小设置为总数/节点数(statbuf.st_size / ntask)

char *
mmaping (char *source)
{
     int src;
     char *sm;
     struct stat statbuf;

     if ((src = open (source, O_RDONLY)) < 0)
    {
        perror (" open source ");
        exit (EXIT_FAILURE);
    }

     if (fstat (src, &statbuf) < 0)
    {
        perror (" fstat source ");
        exit (EXIT_FAILURE);
    }

      sm = mmap (0,(long long)statbuf.st_size/ntask, PROT_READ, MAP_SHARED | MAP_NORESERVE,src, mytask*share*PAGE);

      if (MAP_FAILED == sm)
      {
          perror (" mmap source ");
          exit (EXIT_FAILURE);
      }

      printf("length->%d\n",strlen(sm));

      return sm;
      }

error msg

[kalkyl3:15871] *** Process received signal ***
[kalkyl3:15871] Signal: Segmentation fault (11)
[kalkyl3:15871] Signal code: Address not mapped (1)

有人能给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

由于对mark a comment as an answer的功能请求仍然被拒绝,我在此处复制上述解决方案。

您应该调用getpagesize()而不是假设4kB页面。在任何情况下,千字节都是1024字节,而不是1000字节。您确定文件中每个共享* PAGE大小的块末尾都有一个空字节吗?因为如果没有,strlen将会愉快地跑过mmaped区域的末端和段错误。 - Greg Inozemtsev