- 论坛徽章:
- 0
|
下面这段代码读一个大文件 写到一个新文件里, 但是有问题就是内存不断消耗, 最后速度越来越慢, 寻找这个解决方案.
- #include <stdio.h>
- #include <unistd.h>
- #include <stdlib.h>
- #include <sys/mman.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #include <errno.h>
- #define CHUNK_SIZE 2097152
- int main(int argc, char **argv)
- {
- struct stat st = {0};
- void *data = NULL;
- off_t offset = 0;
- int fd = 0, outfd = 0, n = 0;
-
- if((fd = open("/var/www/xhttpd/html/Fedora-12-x86_64-DVD.iso", O_RDONLY)) > 0
- && fstat(fd, &st) == 0 && (outfd = open("/tmp/out", O_CREAT|O_RDWR, 0644)) > 0)
- {
- fprintf(stdout, "%s::%d offset:%lld\n", __FILE__, __LINE__, offset);
- while((data = mmap(NULL, CHUNK_SIZE, PROT_READ, MAP_SHARED, fd, offset))
- && offset < st.st_size)
- {
- offset += CHUNK_SIZE;
- if(offset > st.st_size) n = offset - st.st_size;
- else n = CHUNK_SIZE;
- fprintf(stdout, "%s::%d offset:%lld\n", __FILE__, __LINE__, offset);
- if(write(outfd, data, n) < 0)
- {
- fprintf(stderr, "write to file failed, %s\n", strerror(errno));
- _exit(-1);
- }
- munmap(data, CHUNK_SIZE);
- }
- close(outfd);
- close(fd);
- }
- }
复制代码 |
|