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



我的想法是,每次每个节点映射大文件的一个块并对其进行处理。然后它修改这个块,然后去下一块。

但是,我总是在集群(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->%dn",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)

谁能给我一些建议?

由于将

评论标记为答案的功能请求仍然被拒绝,因此我在此处复制上述解决方案。

您可能应该调用getpagesize(),而不是假设4kB页面。无论如何,一千字节是 1024 字节,而不是 1000 字节。您确定文件中每个共享*PAGE大小的块的末尾都有一个空字节吗?因为如果没有,strlen 会很高兴地跑过 mmaped 区域的尽头和段错误。– 格雷格·伊诺泽姆采夫

最新更新