Ubuntu fread占用过多cache

john_liqinghan 2016-03-03 11:42:19
最近在ubuntu的平台上碰到这个问题,使用fopen和fread读取文件发现会把ubuntu的cache占用的很大,基本是文件有多大,cache就得有多大?在嵌入式海思的平台上使用,如果使用多个fread读取大文件,就会把cache占用尽了,内存就损耗过度!发生oom killer , Out of memory这种问题!测试代码如下:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include<fcntl.h>

unsigned char *pu8Buf = NULL;

void ExitHandleSig(int signo){
if (SIGINT == signo || SIGTSTP == signo){
if(pu8Buf != NULL) free(pu8Buf);
printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");
}
exit(0);
}
int main(){

#if 1
//fread fopen 版本
FILE *fpStrm=NULL;

int s32UsedBytes = 0, s32ReadLen = 0;
unsigned int bufSize=1280 * 720 * 3 / 2;
pu8Buf = (unsigned char*)malloc(bufSize);
fpStrm = fopen("../videofile/1280_720_H264.h264", "rb");
if(fpStrm == NULL){
printf("Can't open file \n");
exit(0);
}

signal(SIGINT, ExitHandleSig);
signal(SIGTERM, ExitHandleSig);

while(1){
fseek(fpStrm, s32UsedBytes, SEEK_SET);
s32ReadLen = fread(pu8Buf, 1, bufSize, fpStrm);
if(s32ReadLen != bufSize){
printf("end of file \n");
fseek(fpStrm, 0, SEEK_SET);
s32UsedBytes = 0;
s32ReadLen = 0;
}
s32UsedBytes = s32UsedBytes +s32ReadLen ;
sleep(5);
}
#else
//read open 版本

int fileFd;
int s32UsedBytes = 0, s32ReadLen = 0;
unsigned int bufSize=720 * 480 * 3 / 2;
pu8Buf = (unsigned char*)malloc(bufSize);
fileFd = open("../videofile/720_480_H264.h264",O_RDONLY,S_IRUSR);
if(fileFd == -1)
printf("Can't open file \n");

signal(SIGINT, ExitHandleSig);
signal(SIGTERM, ExitHandleSig);

while(1){
lseek(fileFd, s32UsedBytes, SEEK_SET);
s32ReadLen = read(fileFd,pu8Buf,bufSize);
if(s32ReadLen != bufSize){
printf("end of file \n");
lseek(fileFd, 0, SEEK_SET);
s32UsedBytes = 0;
s32ReadLen = 0;
}
s32UsedBytes = s32UsedBytes +s32ReadLen ;
usleep(50000);
}
#endif
return 1;
}


无论是fread还是read都会如此!Ubuntu怎么有这个bug?
...全文
226 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
john_liqinghan 2016-04-13
  • 打赏
  • 举报
回复
实在无法找到很满意的答案,好内存确实是存在!只能手动清除cache!
码农Ben 2016-03-04
  • 打赏
  • 举报
回复
Linux系统在进行文件读写时都会用到缓存。这些缓存的释放不是立刻执行的。计时用了fclose还不会立刻释放。 考虑用posix_fadvise函数加上POSIX_FADV_DONTNEED来释放。 我在连续多次读写文件时都会这么做。 参考下一下两篇博文: http://leoncom.org/?p=650719 http://blog.yufeng.info/archives/1917
C_Rabbit 2016-03-04
  • 打赏
  • 举报
回复
关注,现在也在学习这一块

21,616

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧