【发布时间】:2010-12-30 16:11:49
【问题描述】:
我有一些需要解析的大文件,人们一直在推荐 mmap,因为这样可以避免将整个文件分配到内存中。
但是看着“顶部”,它看起来确实像我将整个文件打开到内存中,所以我想我一定是做错了什么。 '顶级节目 >2.1 gig'
这是一个代码 sn-p,它显示了我在做什么。
谢谢
#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 :-) 为您修复了代码标签。
-
啊谢谢一百万! #include 怎么样,我无法将这些放入代码示例中
-
标记整个块然后使用 CTRL-K - 这将缩进四个空格。我现在已经完成了,您应该能够看到一个 stdio 包含。