我得到了一些我需要解析的大文件,而且人們一直在推薦mmap,因爲這應該避免必須在內存中分配整個文件。mmap問題,分配大量內存
但看着'頂部'它看起來好像我打開整個文件到內存中,所以我認爲我必須做錯了什麼。 '熱門節目> 2.1演出'
這是一個代碼片斷,顯示我在做什麼。
感謝
#include <stdio.h>
#include <stdlib.h>
#include <err.h>
#include <fcntl.h>
#include <sysexits.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <sys/mman.h>
#include <cstring>
int main (int argc, char *argv[]) {
struct stat sb;
char *p,*q;
//open filedescriptor
int fd = open (argv[1], O_RDONLY);
//initialize a stat for getting the filesize
if (fstat (fd, &sb) == -1) {
perror ("fstat");
return 1;
}
//do the actual mmap, and keep pointer to the first element
p =(char *) mmap (0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);
q=p;
//something went wrong
if (p == MAP_FAILED) {
perror ("mmap");
return 1;
}
//lets just count the number of lines
size_t numlines=0;
while(*p++!='\0')
if(*p=='\n')
numlines++;
fprintf(stderr,"numlines:%lu\n",numlines);
//unmap it
if (munmap (q, sb.st_size) == -1) {
perror ("munmap");
return 1;
}
if (close (fd) == -1) {
perror ("close");
return 1;
}
return 0;
}
@monkeyking,code-pre的正確關閉是/ pre/code,不是post :-)修復了代碼標籤。 – paxdiablo 2009-12-29 03:34:34
啊,萬分感謝! #include我不能把它們放到代碼示例中 – monkeyking 2009-12-29 03:37:54
標記整個塊然後使用CTRL-K - 這會縮進四個空格。我現在已經這樣做了,你應該可以看到一個stdio包含。 – paxdiablo 2009-12-29 03:44:06