gpt4 book ai didi

C编程: How to use mmap(2) to read file parallel by multiple threads?

转载 作者:行者123 更新时间:2023-11-30 16:35:46 26 4
gpt4 key购买 nike

我正在尝试编写多线程代码来使用 mmap(2) 以固定 block 读取文件并计算单词数。每个线程都处理文件的单独部分,从而加快文件处理速度。我可以使用 mmap(2) 读取该文件单线程。当线程数超过 1 时,会因段错误而失败。

for( unsigned long cur_pag_num = 0; cur_pag_num < total_blocks; cur_pag_num++ ) {
mmdata = mmap(
NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, (fileOffset + (cur_pag_num * PAGE_SIZE))
);

if (mmdata == MAP_FAILED) printf(" mmap error ");

unsigned long wc = getWordCount( mmdata );
parserParam->wordCount +=wc;
munmap( mmdata, PAGE_SIZE );
}

unsigned long getWordCount(char *page){
unsigned long wordCount=0;
for(long i = 0 ; page[i] ;i++ ){
if(page[i]==' ' || page[i]=='\n')
wordCount++;
}
return wordCount;
}

我发现代码在 getWordCount(mmdata) 内失败。我在这里做错了什么?

注意:文件大小大于主存大小。因此以固定大小的 block 读取 (PAGE_SIZE)。

最佳答案

getWordCount 正在访问映射页面之外,因为循环在找到空字节时停止。但 mmap() 不会在映射页面后添加空字节。您需要将映射页面的大小传递给函数。当到达该索引或空字节时,它应该停止(如果文件不够长,无法填充页面,则页面的其余部分将为零)。

for( unsigned long cur_pag_num = 0; cur_pag_num < total_blocks; cur_pag_num++ ) {
mmdata = mmap(
NULL, PAGE_SIZE, PROT_READ, MAP_PRIVATE, fd, (fileOffset + (cur_pag_num * PAGE_SIZE))
);

if (mmdata == MAP_FAILED) printf(" mmap error ");

unsigned long wc = getWordCount( mmdata, PAGE_SIZE );
parserParam->wordCount +=wc;
munmap( mmdata, PAGE_SIZE );
}

unsigned long getWordCount(char *page, size){
unsigned long wordCount=0;
for(long i = 0 ; i < size && page[i] ;i++ ){
if(page[i]==' ' || page[i]=='\n')
wordCount++;
}
return wordCount;
}

顺便说一句,您的方法还有另一个问题:跨越页面边界的单词将被计算两次。

关于C编程: How to use mmap(2) to read file parallel by multiple threads?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48751241/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com