保持外部磁盘旋转
Posted
技术标签:
【中文标题】保持外部磁盘旋转【英文标题】:Keep external disk spinning 【发布时间】:2014-03-15 16:25:42 【问题描述】:我的笔记本有一个非常烦人的问题。我有一个带系统的内部 SSD 驱动器和一个用于大型游戏的外部旧 HDD 驱动器(在光盘托架中)。问题是,在每 10 秒不活动之后,HDD 驱动器就会继续旋转。无论如何都会发生这种情况 - 尝试了一切(包括 Windows 电源管理),但没有运气 - 磁盘每次都会完全忽略所有设置。这会在减速后尝试访问新数据时造成无法忍受的延迟,这使大多数游戏无法玩。这些不断的加速/减速也会缩短磁盘寿命。
因此,在尝试了一些方法后,我决定编写一个 C# 应用程序,该应用程序将简单地计算下面列表中随机文件中的行数 - 位于外部驱动器上,通过逐行读取文件。它是一个 winforms 应用程序,但方法 keepSpinning 在单独的线程中调用。
List<string> filesToSpin = new List<string>();
public Form1()
filesToSpin.Add(@"D:\book\Generic_User_Guide.pdf");
filesToSpin.Add(@"D:\book\Quick Guide.pdf");
filesToSpin.Add(@"D:\book\pck_ls.pdf");
filesToSpin.Add(@"D:\book\guide_amd64.pdf");
private void keepSpinning()
while(someKeepAliveVariable)
Random r = new Random();
int index = r.Next(filesToSpin.Count);
string spinThis = filesToSpin[index];
int counter = 0;
string line;
Console.WriteLine("Reading file: " + spinThis);
System.IO.StreamReader file =
new System.IO.StreamReader(spinThis);
while ((line = file.ReadLine()) != null)
counter++;
file.Close();
Console.WriteLine("Read 0 lines.", counter.ToString());
Thread.Sleep(2000);
嗯。令人惊讶的是,这也不起作用。它工作了一段时间,但它继续打印读取文件的信息但磁盘停止。我猜驱动器正在以某种方式缓存这些文件。行计数方法也非常占用 CPU。 任何有关代码更改的建议都会有所帮助,也期待任何其他解决方案。
【问题讨论】:
【参考方案1】:写入磁盘上的文件而不是读取。记得每隔一段时间清除这些文件。
另外,HDD 听起来不太好。
【讨论】:
【参考方案2】:首先,感谢大家的回复。我尝试了一些不同的方法,经过一年的努力,终于找到了解决方案。抱歉没有给出硬盘名称。这是:WD750BPVT。我也没有提到第二个问题:驱动器在空闲时单击,在磁盘旋转之前几次。 我会回答我自己的问题以节省别人的头发。这个问题不容易追踪。
编写 C# 应用程序是一种很好的方法,但它也有其缺点。当我将代码更改为写入数据而不是读取数据时,它非常成功(没有停机),但驱动器在空闲时不断点击(每 2-3 秒)。
有人会说,由于咔哒声,硬盘已经准备好死机,我应该备份我的数据,同时准备将设备丢弃。但是我找到了一个解释。所有这些事情的原因是一个功能,旨在节省一些电力和磁盘寿命(原文如此!)。这个功能,或者实际上其中两个是:
Automatic Acoustic Management (AAM)
Advanced Power Management (APM)
电源管理调节减速,声学管理负责头部停车(咔哒声)。 您所要做的就是禁用这两个。 例如,您可以在 CrystalDiskInfo 中执行此操作:功能 -> 高级 -> AAM/APM 控制,选择所需的驱动器并单击两个禁用按钮。问题解决,直到重新启动。它不是永久性的,因此将 CrystalDiskInfo 添加到启动中是一个不错的举措。
此解决方案也可能适用于其他设备/制造商,因此如果您有类似问题,我强烈建议您尝试一下。
【讨论】:
【参考方案3】:它可能会失败,因为操作系统读取了文件的大缓冲区并将其放入缓存中。
你可以:
写入文件而不是读取,每次都刷新文件。 使用 FILE_FLAG_NO_BUFFERING(那么你需要使用 win32 API CreateFile)。【讨论】:
只需在 Write() 之后关闭一个 .NET FileStream 就足够了。以上是关于保持外部磁盘旋转的主要内容,如果未能解决你的问题,请参考以下文章