Tengo algunos archivos enormes que necesito analizar, y la gente ha estado recomendando mmap porque esto debería evitar tener que asignar todo el archivo en la memoria.problema mmap, asigna grandes cantidades de memoria
Pero al mirar 'arriba' parece que estoy abriendo todo el archivo en la memoria, así que creo que debo estar haciendo algo mal. 'top shows> 2.1 gig'
Este es un fragmento de código que muestra lo que estoy haciendo.
Gracias
#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, el cierre adecuado para el código pre es/pre/código, no para la publicación :-) Se corrigieron las etiquetas de código por usted. – paxdiablo
¡Ahh gracias un millón! ¿Qué pasa con #include No pude poner estos en el ejemplo de código – monkeyking
Marque todo el bloque y luego use CTRL-K, esto sangrará por cuatro espacios. Ya lo hice y deberías poder ver un stdio incluido. – paxdiablo