我是一个内存映射一个大文件(~200GB)到一个单一的区域/视图,并顺序写入它。 每隔一段时间我执行一个boost::interprocess::mapped_region::flush(last, current, false)
。
过了一段时间,该过程耗尽整个系统内存。 据我所知,这是正常的,因为它将释放内存作为其他进程请求内存。
这在Windows 8上运行良好。但是,在Windows 7上运行它似乎没有与AJAvideo卡的驱动程序打好,它开始影响性能(丢弃IO数据包)。
有没有什么办法可以强制Windows 7将内存中的部分内容刷新到磁盘(写入数据后只有几秒钟的时间,记住我正在按顺序遍历整个文件),以便不用整个可用的系统内存?
法拉盛与填海无关,IYAM。 它只是确保脏页被写出(我认为你仍然需要一个磁盘同步,以确保它实际上/击中磁盘/)。
所以,你正在寻找一种解除映射的方法。
也许你可以使用像
EmptyWorkingSet
清除尽可能多的页面 SetProcessWorkingSetSize
临时减少允许的进程工作集。 当然,以更便携的方式,你可能会放弃去映射和重新映射。 如果访问是旋转硬盘并且在重映射中保持顺序,那么可能不会有性能损失(如果内核预取数据(例如,由于madvise()
或等同的窗口)