2013-07-09 43 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