2013-07-09 45 views
0

我们遇到了一些内部开发的应用程序的一个奇怪的问题,并认为它在代码中很深,但我们写了一个快速样本来测试它,我们遇到了同样的问题。直到文件被删除之前,内存还没有给出?

下面是示例代码:

#include <stdio.h> 

int main(void) 
{ 
    int i; 
    int j; 
    int COUNT = 750000; 

    double x[100]; 
    double y[100]; 

    FILE *OutputFile1; 
    FILE *OutputFile2; 
    FILE *OutputFile3; 
    FILE *OutputFile4; 
    FILE *OutputFile5; 
    FILE *OutputFile6; 
    FILE *OutputFile7; 
    FILE *OutputFile8; 
    FILE *OutputFile9; 

    OutputFile1 = fopen("Output_file_1.dat","w"); 
    OutputFile2 = fopen("Output_file_2.dat","w"); 
    OutputFile3 = fopen("Output_file_3.dat","w"); 
    OutputFile4 = fopen("Output_file_4.dat","w"); 
    OutputFile5 = fopen("Output_file_5.dat","w"); 
    OutputFile6 = fopen("Output_file_6.dat","w"); 
    OutputFile7 = fopen("Output_file_7.dat","w"); 
    OutputFile8 = fopen("Output_file_8.dat","w"); 
    OutputFile9 = fopen("Output_file_9.dat","w"); 

/* Do stuff in here */ 
    /* Initialize the arrays */ 
    for(i = 0; i < 100; i++) 
    { 
     x[i] = 2.50 * (double)i; 
     y[i] = 10.0 * (double)i; 
    } 
    printf("Initialized the x and y arrays\n"); 
    /* Write junk to files */ 
    for(i = 0; i < COUNT; i++) 
    { 
     printf("Outer loop %d\n", i); 
     for(j = 0; j < 100; j++) 
     { 
     fprintf(OutputFile1," %e", x[j]); 
     fprintf(OutputFile2," %e", x[j]); 
     fprintf(OutputFile3," %e", x[j]); 
     fprintf(OutputFile4," %e", x[j]); 
     fprintf(OutputFile5," %e", x[j]); 
     fprintf(OutputFile6," %e", y[j]); 
     fprintf(OutputFile7," %e", y[j]); 
     fprintf(OutputFile8," %e", y[j]); 
     fprintf(OutputFile9," %e", y[j]); 
     } 
     fprintf(OutputFile1,"\n"); 
     fprintf(OutputFile2,"\n"); 
     fprintf(OutputFile3,"\n"); 
     fprintf(OutputFile4,"\n"); 
     fprintf(OutputFile5,"\n"); 
     fprintf(OutputFile6,"\n"); 
     fprintf(OutputFile7,"\n"); 
     fprintf(OutputFile8,"\n"); 
     fprintf(OutputFile9,"\n"); 
    } 

/* End doing stuff here */ 
    fflush(OutputFile1); 
    fclose(OutputFile1); 
    fflush(OutputFile2); 
    fclose(OutputFile2); 
    fflush(OutputFile3); 
    fclose(OutputFile3); 
    fflush(OutputFile4); 
    fclose(OutputFile4); 
    fflush(OutputFile5); 
    fclose(OutputFile5); 
    fflush(OutputFile6); 
    fclose(OutputFile6); 
    fflush(OutputFile7); 
    fclose(OutputFile7); 
    fflush(OutputFile8); 
    fclose(OutputFile8); 
    fflush(OutputFile9); 
    fclose(OutputFile9); 

    return(0); 
} 

所以,这里是当您运行此会发生什么。如果你在一个终端窗口中运行它,并在运行时在另一个终端窗口中运行它,你会注意到你的内存被吃掉了。大约需要8分钟才能运行,并且完成后,系统不会返回内存,直到文件被删除。一旦文件被删除,所有的内存都被释放回系统。

这只是C与最新的gcc编译器,CentOs 6.3。

难道我们失去了一些东西?

谢谢!

回答

0

“系统并没有给记忆回来。”你怎么知道的? “内存报告为top”和“您可以使用的内存”之间存在差异。这是因为尽可能将磁盘I/O存储在缓存中 - 这样,如果需要再次使用同一文件,则信息已在内存中可用 - 访问速度更快。一旦你删除了一个文件,它不再有用保存在缓存中 - 所以缓存被清除。

查看此问题的另一种方法是使用free命令。在我的Linux系统中这样做,我看到以下内容:

   total  used  free shared buffers cached 
Mem:  66005544 65559292  446252   0  199832 60332160 
-/+ buffers/cache: 5027300 60978244 
Swap:  1044216  1884 1042332 

重点线是一个写着“-/+ buffers/cache”。你可以看到第一行告诉我“446M免费” - 在64G机器上不是很多。但第二行说“只有开玩笑,你有60 G免费”。那就是real“空闲内存”。

查看该行是否“放弃内存”而不必删除文件。我想你会发现它的确如此。

+0

非常有意义,谢谢! – speedpacer

0

系统缓存这些文件以便下次快速访问。由于内存不被用于缓存的应用程序使用。如果文件消失或其他应用程序需要更多内存运行,缓存将被释放。

参见:Linux Memory Management

+0

谢谢你的时间! – speedpacer