c - 疯狂: not understood

标签 c linux ram mmap

背景:

我在一台旧笔记本电脑上运行。我总共只有 512Mo 可用 128Mo ram。没钱买更多的 ram。

我使用 mmap 来帮助我规避这个问题,而且效果很好。 C代码。 Debian 64 位。

问题:

除了我所有的努力,我很快就用完了内存,我想知道我是否可以释放我读取的 mmaped 区域以释放我的 ram。

我读到 madvise 可以提供帮助,尤其是选项 MADV_SEQUENTIAL

但我不是很了解全貌。

需求:

为了能够在区域被读取后释放 mmaped 分配的内存,这样它就不会用大文件填满我的整个 ram。我不会很快阅读它,所以它对我来说是垃圾。将它保存在 ram 中是没有意义的。

更新:我还没有处理完文件,所以不想调用 munmap。我还有其他事情要做,但在它的另一个区域。随机读取。

最佳答案

对于 mmap()ed 文件的随机读/写访问,MADV_SEQUENTIAL 可能不是很有用(实际上可能会导致不良行为)。 MADV_RANDOMMADV_DONTNEED 在这种情况下会是更好的选择。但是,请注意内核可以自由地忽略任何 madvise() - 尽管据我了解,Linux 目前不会,因为它倾向于将 madvise() 视为更多命令而不是建议...

另一种选择是 mmap() 仅根据需要选择文件的部分,并在完成后 munmap() 它们,也许维护一个一些当前事件映射的池(即,如果需要,一次映射多个区域,但仍保持有限)。

关于c - 疯狂: not understood,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23677988/

相关文章:

c - sscanf 用法 - 如何验证完成的扫描与中止的扫描

c - 如何在labwindows CVI中将文本打印到列表框

c - 在 WinAPI 中优雅地关闭无窗口应用程序

c++ - g++ 将库附加到应用程序

php - 你如何从ssh运行一个php文件?

java - joda ArrayIntList(5000000) 与 int[5000000] 内存消耗

c 按值传递数组?

linux - 同一服务器上的两个 OwnCloud 实例

c - 在 Linux 中使用 C 实现零 RAM

android - Vector Drawables 与 RAM 方面的位图 (Android)