加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

如何并行mmap以便更快地读取文件?

发布时间:2020-12-16 06:49:58 所属栏目:百科 来源:网络整理
导读:我正在研究 this code并且现在正在使用mmap,但我想知道我是否可以并行使用mmap,如果是的话,如何实现它.假设我在并行文件系统(GPFS,RAID0,无论什么)上有我的数据,我想用n个进程读取它. 例如,我怎样才能让每个处理器将1 / n个连续的数据块读入内存?或者,或者,
我正在研究 this code并且现在正在使用mmap,但我想知道我是否可以并行使用mmap,如果是的话,如何实现它.假设我在并行文件系统(GPFS,RAID0,无论什么)上有我的数据,我想用n个进程读取它.

例如,我怎样才能让每个处理器将1 / n个连续的数据块读入内存?或者,或者,将每第n个内存块(1 B,1 MB,100 MB,1 GB,无论我选择哪种优化)读入内存?

我在这里假设一个posix文件系统.

解决方法

这是我用于并行读取的mpi功能.它根据pagesize将文件切割成n个连续的片段,并让每个进程通过mmap读取一个单独的片段.一些额外的技巧需要在最后完成,因为我将(可能)获得一行的前半部分作为它的最后一行,并且处理i 1将获得与第一行相同的行的后半部分.

ikind nchars_orig; // how many characters were in the original file
int pagesize = getpagesize();
off_t offset;
struct stat file_stat;
int finp = open(inpfile,O_RDONLY);
int status = fstat(finp,&file_stat);
nchars_orig = file_stat.st_size;

// find out hwich pieces of the file each process should read
ikind nchars_per_proc[nprocs];
for(int ii = 0; ii < nprocs; ii++) {
    nchars_per_proc[ii] = 0;
}   
// start at the second to last proc,so the last proc will get hit first
// we will decrement him at the end,so this will distribute the work more evenly
int jproc = nprocs-2;
ikind nchars_tot = 0;
ikind nchardiff = 0;
for(ikind ic = 0; ic < nchars_orig; ic+= pagesize) {
    jproc += 1;
    nchars_tot += pagesize;
    if(jproc == nprocs) jproc = 0;
    if(nchars_tot > nchars_orig) nchardiff = nchars_tot - nchars_orig;
    nchars_per_proc[jproc] += pagesize;
}   
nchars = nchars_per_proc[iproc];
if( iproc == nprocs-1 ) nchars = nchars - nchardiff;
offset = 0;
for(int ii = 0; ii < nprocs; ii++) {
    if( ii < iproc ) offset += nchars_per_proc[ii];
} 
cs = (char*)mmap(0,nchars,PROT_READ,MAP_PRIVATE,finp,offset);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读