【问题标题】: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。 任何有关代码更改的建议都会有所帮助,也期待任何其他解决方案。

【问题讨论】:

    标签: c# hard-drive


    【解决方案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 就足够了。
        猜你喜欢
        • 2022-01-17
        • 1970-01-01
        • 2011-02-12
        • 2014-08-20
        • 2011-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多