S*****y 发帖数: 567 | 1 【 以下文字转载自 Linux 讨论区 】
发信人: Schummy (QQ), 信区: Linux
标 题: 新人5个包子请教问题,redhat读写文件的内存问题
发信站: BBS 未名空间站 (Tue Apr 10 18:18:18 2012, 美东)
希望有个大虾能给解释下。
版本是2.6.32-71.el6.x86_64
发现读取文件后,free mem大幅下降。文件很大,10几G的样子
total used free shared buffers cached
Mem: 32091 24459 7632 0 7 23250
-/+ buffers/cache: 1200 30891
Swap: 34271 21 34250
就是这里free/Mem那一格
网上查了说看是否内存泄漏应该看swap?
我有一个程序,读取文件。
如果我手动清理掉used Mem
echo 3 > /proc/sys/vm/drop_caches
然后跑一次那个程序。就会看到大概10个G的内存被用了,没有释放(文件大小差不多)
然后速度是1分钟。
然后在不释放那些内存的情况下,再跑n次,每次都是10秒钟。包括读取另外一个差不
多大小的文件,也是10秒钟的样子。free还是会减少,swap没什么变化。
请教为什么会造成速度上的差别呢?
另外如果我如果我手动清理掉used Mem,不跑那个程序。只是往硬盘写入一个10G的文
件,也是会看到free大大减少。
程序是
uint16_t lenNet, lenHost;
char buffer[65536];
char* bbuf = buffer;
int readed;
const int FIRST_READ = sizeof(unsigned short int);
readed = fread(&lenNet, FIRST_READ, 1, fp);
while(readed==1){
lenHost = rip_ntohs(lenNet);
fread(buffer, lenHost, 1, fp);
readed = fread(&lenNet, FIRST_READ, 1, fp);
}
buffer是会自己释放的吧
谢谢了 | d****n 发帖数: 1637 | 2 I wonder how the below code break the loop.
if lenHost is signed number it could be a problem for fread.
fread convert it to a unsigned large number and read the huge block at one
shot.
check if lenHost defined correctly as size_t or the limits.
while(readed==1){
lenHost = rip_ntohs(lenNet);
fread(buffer, lenHost, 1, fp);
} | S*****y 发帖数: 567 | 3 lenNet,lenHost
都是uint16_t...
然后我跑了测试了,lenHost最大20。
其实是很多条message。第一个是表示message的长度。文件都是读完处理完了,应该没
有太大问题。有问题就跑不完了。
【在 d****n 的大作中提到】 : I wonder how the below code break the loop. : if lenHost is signed number it could be a problem for fread. : fread convert it to a unsigned large number and read the huge block at one : shot. : check if lenHost defined correctly as size_t or the limits. : while(readed==1){ : lenHost = rip_ntohs(lenNet); : fread(buffer, lenHost, 1, fp); : }
| y***d 发帖数: 2330 | 4 -/+ buffers/cache: 1200 30891
it means the actual free memory was 30891.
Most of the memory was 'used' as disk cache, which would be dumped whenever
a program needed some amount of memory.
so there is nothing to worry about.
【在 S*****y 的大作中提到】 : 【 以下文字转载自 Linux 讨论区 】 : 发信人: Schummy (QQ), 信区: Linux : 标 题: 新人5个包子请教问题,redhat读写文件的内存问题 : 发信站: BBS 未名空间站 (Tue Apr 10 18:18:18 2012, 美东) : 希望有个大虾能给解释下。 : 版本是2.6.32-71.el6.x86_64 : 发现读取文件后,free mem大幅下降。文件很大,10几G的样子 : total used free shared buffers cached : Mem: 32091 24459 7632 0 7 23250 : -/+ buffers/cache: 1200 30891
| b***i 发帖数: 3043 | 5 你的程序很不全,连括号都对不上,那个readed并没有每次更新,那你怎么跳出while
循环?
【在 S*****y 的大作中提到】 : lenNet,lenHost : 都是uint16_t... : 然后我跑了测试了,lenHost最大20。 : 其实是很多条message。第一个是表示message的长度。文件都是读完处理完了,应该没 : 有太大问题。有问题就跑不完了。
| S*****y 发帖数: 567 | 6
while
不好意思,是,我下午没有写好,把中间的注释删的时候没注意,修改了。
【在 b***i 的大作中提到】 : 你的程序很不全,连括号都对不上,那个readed并没有每次更新,那你怎么跳出while : 循环?
|
|