逐行读取文件增加内存?

时间:2012-05-31 00:51:38

标签: c

我是c的新手。我有一些代码,我试图在Cuda中测试,但是在拉入数据方面有点麻烦。我的数据驻留在一个文件(19GB)中,我基本上计划读取一定数量的行,将它们保存到列表中,发送他们要处理并为整个文件再次执行此操作。

我刚开始学习如何做到这一点,并且遇到了我不确定的C问题,当我运行程序时,我的内存不断增加(当我在我的mac上进入活动监视器时),但它似乎并没有与c程序联系在一起,它只是显示非活动内存的增长和增长。即使在程序停止后,内存仍处于非活动状态(只有重新启动才能重新启动)。据我所知,它不影响程序,但似乎很奇怪,我很想知道为什么以及我能做些什么呢?

我对malloc和free有一点了解(对不起,我更了解Java / Python,从来没有这么做过)但是我不确定我是否想在这段代码中这样做,因为我认为{{1}变量不断被覆盖。

以下是代码:

line

我感谢有关此处发生的事情的任何提示/建议,以及是否有更好的方法可以做到这一点?

更新:对不起,我没有提及,我注意到的行为是在程序运行时。随着它运行,非活动内存不断增长和增长。我有大约4演出免费,30秒后它全部完全重新启动是唯一的方法来释放它(即使c程序被杀死的内存没有被释放)。

3 个答案:

答案 0 :(得分:2)

您的代码不会分配任何内存(FILE结构的内存除外),因此您没有任何依赖于文件大小的泄漏。

但是,泄漏了一些内存,因为在完成访问文件后忘记了fclose(fp);

作为建议,如果您使用的是Linux,请使用valgrind --leak-check=full ./yourapp - 假设您的程序是使用调试符号(gcc中的-g开关)编译的,您将获得详细的泄漏报告if / where程序是否泄漏内存。

答案 1 :(得分:2)

这是完全正常的。让内存自由需要努力。这种努力完全被浪费了,因为只要需要内存,系统就必须将其从空闲池中删除。将内存从一个用户直接转换到另一个用户的效率要高得多。所以系统很聪明而不是愚蠢。

如果你今天使用的内存减少了一半,明天可以使用两倍。因此,让内存自由是没有好处的。

当您从文件中读取行时,操作系统会从文件中读取整个块。如果可能的话,它会尝试将这些块保留在内存中,因为这样可以避免将来从磁盘读取。如果没有更好的使用内存,它会将这些文件块保留在内存中。这两者都节省了必须使内存空闲的努力,只是为了再次使用内存,并加快了对文件同一块的任何访问速度。

使这个内存免费是没有好处的。它只需要操作系统的努力就可以使其自由,操作系统的努力使其在将来再次使用,并且操作系统失去了避免磁盘读取的机会。所以让记忆自由是完全愚蠢的。

答案 2 :(得分:1)

因为你的使用

    fgets(buffer, int size, file);

只有在你点击EOF时才会停止阅读。有两种方法可以解决它,或者使用

    while(fgets(buffer, size, file) != EOF){};

    while(fread(buffer, sizeof(char), nmem, file) < 1024){};

我建议使用后者,出于某种原因,我倾向于使用fgets遇到问题,并且你可以更好地控制你对fread所做的事情。