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 分钟,运行完成后,系统不会归还内存,直到文件被删除。删除文件后,所有内存都会释放回系统。

它只是带有最新 gcc 编译器 CentOs 6.3 的 C。

我们错过了什么吗?

谢谢!

4

2 回答 2

0

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

请参阅:Linux 内存管理

于 2013-07-09T19:21:53.903 回答
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 free”——在 64G 机器上不是很多。但是第二行说“只是开玩笑,你有 60 G 免费”。那是真正的“空闲内存”。

查看该行是否“回馈内存”而无需删除文件。我想你会发现它确实如此。

于 2013-07-09T19:22:37.620 回答