У меня есть некоторые огромные файлы, которые мне нужны для синтаксического анализа, и люди рекомендуют mmap, потому что это не должно выделять весь файл в памяти.Проблема mmap, выделяет огромные объемы памяти
Но, глядя на «верх», похоже, что я открываю весь файл в памяти, поэтому я думаю, что я должен делать что-то неправильно. 'top shows> 2.1 gig'
Это фрагмент кода, который показывает, что я делаю.
Благодаря
#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, правильное закрытие для кода-pre/pre-/code, а не сообщение :-) Исправлены теги кода для вас. – paxdiablo
Ahh благодарит миллион! Как насчет #include Я не мог поместить их в образец кода – monkeyking
Отметьте весь блок, затем используйте CTRL-K - это будет отступ четырьмя пробелами. Я сделал это сейчас, и вы сможете увидеть stdio include. – paxdiablo