我正在处理的程序处理大量数据(> 32GB)。但是,由于“流水线操作”,在每个给定时间内主存储器中最多存在600 MB(我检查过,它按计划工作)。
如果程序已经完成然后我切换回Firefox打开的工作区,例如(还有其他),它需要一段时间,直到我可以再次使用它(也有一段时间HDD非常活跃)。这个事实让我想知道Linux(我使用的操作系统)是否在程序运行时交换其他程序以及为什么?
我的机器上安装了4 GB的RAM,而我的程序处于活动状态时,它的使用率绝不会超过2 GB。
我的程序只分配/解除分配两种不同大小的动态内存。 32和64 MB块。它是用C ++编写的,我使用new和delete。一旦我释放它们并且保持我的其他内存不受影响,Linux是否应该足够聪明地重用这些块?
为什么Linux会把我的东西从内存中解放出来? 这是否有其他影响我没有考虑过? 如果不编写自定义内存管理系统,我可以解决这个问题吗?
答案 0 :(得分:1)
最可能的罪魁祸首是文件缓存。好消息是您可以禁用文件缓存。如果没有缓存,您的软件将运行得更快,但前提是您不需要重新加载相同的数据。
您可以直接使用linux API执行此操作,但我建议您使用Boost ASIO等库。如果您的软件受I / O限制,您还应该使用异步I / O来提高性能。
答案 1 :(得分:1)
所有最近使用的页面都会导致较旧的页面被挤出磁盘缓存。因此,当某个其他程序运行时,它必须重新登录。
你想要做的是使用posix_fadvise(或posix_madvise如果你的内存映射文件)弹出你迫使操作系统缓存的页面,这样你的程序就没有了巨大的缓存空间。这将使其他程序中的旧页面保留在缓存中。