如何避免硬盘抖动

时间:2010-06-25 14:10:57

标签: c++ visual-studio-2008 windows-xp

我正在开发一个使用大量内存的大型程序。该程序非常实验性,我一直在添加和删除大块代码。有时我会添加一个过于耗费内存的例行程序,硬盘驱动器将开始颠簸,程序(以及整个系统)将放慢速度。它可以很容易地用5分钟来关闭它!

我想要的是一种避免这种情况的机制。要么是运行时程序,要么是在运行程序之前要做的事情,这可以说是“如果你运行这个程序存在硬盘抖动的风险 - 现在中止以避免减速到蜗牛的速度”。

有什么想法吗?

编辑:忘记提及,我的程序使用多个线程。

5 个答案:

答案 0 :(得分:3)

当有多个线程或进程同时访问磁盘时,Windows XP很糟糕。这实际上是您在应用程序开始交换时遇到的情况,因为操作系统在读取其他页面时会写出一些页面。对于这个问题,Windows XP(以及Server 2003)完全是垃圾。这真是一种耻辱,因为它意味着交换几乎与这些系统上的颠簸同义。

您的选择:

  • Microsoft在Vista和Server 2008中修复了此问题。因此,请停止使用9岁的操作系统。 :)
  • 使用无缓冲的I / O将数据读/写到文件中,并在应用程序中实现自己的分页。像这样实现你自己的“交换”可以避免颠簸。

请在此处查看此问题的更多详细信息:How to obtain good concurrent read performance from disk

答案 1 :(得分:3)

您可以考虑使用SetProcessWorkingSetSize。这在调试时非常有用,因为当内存耗尽时,您的应用程序会因致命异常而崩溃,而不是将您的计算机拖入颠簸状态。

http://msdn.microsoft.com/en-us/library/ms686234%28VS.85%29.aspx

类似的问题

Set Windows process (or user) memory limit

答案 2 :(得分:2)

我不熟悉Windows编程,但在Unix下,您可以限制程序可以使用setrlimit()的内存量。也许有类似的东西。目标是让程序在使用大量内存时中止,而不是颠簸。限制将略小于机器上的总物理内存。我估计在75%到90%之间,但是需要一些实验才能找到最佳设置。

答案 3 :(得分:1)

您的程序可能会使用一些内存管理。虽然有一些程序确实需要同时将所有内容保存在内存中,但很有可能,只要有一点远见,您就可以重新编写程序以重用或丢弃所需的大量内存。

你的程序也会运行得更快。如果您使用那么多内存,那么基本上所有内置的第一级和第二级缓存都可能溢出,这意味着CPU主要等待内存加载而不是处理代码的指令。

答案 4 :(得分:-1)

我宁愿为你的程序运行的计算机确定合理的最低要求,并且在安装过程中要么警告用户没有足够的可用内存,要么拒绝安装。

每次他启动该计划时告诉他都是荒谬的。