保持外部磁盘旋转

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 就足够了。

以上是关于保持外部磁盘旋转的主要内容,如果未能解决你的问题,请参考以下文章

相机的外部参数 - 它们是恒定的吗?

如何围绕对象外部的点旋转节点(即不围绕对象的中心点旋转)

实现物体绕不同轴旋转,并可以外部调用的函数

连接外部磁盘至Parallels Desktop虚拟机

连接外部磁盘至Parallels Desktop虚拟机

EMRFS 是不是使 S3 对外部客户端保持一致