【问题标题】:Is Parallel File.Read Faster than Sequential Read?Parallel File.Read 比顺序读取快吗?
【发布时间】:2010-07-13 22:25:38
【问题描述】:

我只是想知道并行File.Read 使用 PLINQ/Parallel 可以更快吗?我的代码如下(.Net 4.0):

public static void ReadFileParallel(List<string> fileName)
{
   Parallel.Foreach(fileName, file=>File.Read(file));
}

public static void ReadFilePLINQ(List<string> fileName)
{
    fileName.AsParallel().foreach(file=>File.Read(file));
}

我问这个的原因是因为我认为文件读取是 IO 绑定的,所以并行不会有帮助,对吗?

【问题讨论】:

    标签: c# file-io


    【解决方案1】:

    视情况而定。

    如果您的文件位于不同的位置、不同的网络共享或不同的物理硬盘驱动器上,那么是的,并行加载可能会有所帮助。如果它们位于单个旋转硬盘驱动器上,则并行读取文件可能会严重影响您的性能,因为这些并行读取可能会产生额外的寻道时间。

    如果您的文件位于 SSD 上,您的性能可能会稍差,但这取决于您并行读取的文件数量以及它们的大小。我想在某个文件大小阈值和并行读取次数下,性能会显着下降。如果没有一些实验,很难说出那个。

    【讨论】:

    • 这些是合理的标准。不过,在实践中,我会说是衡量而不是猜测。
    【解决方案2】:

    您会这么认为,但测量结果并非如此。当文件 I/O 具有显着延迟时,尤其是在网络上,并行执行可以保持管道充满。

    【讨论】:

      【解决方案3】:

      MSFT 提供了一个出色的 PDF,其中详细介绍了并行和线程的可能性。

      这可能会有所帮助。

      http://www.microsoft.com/downloads/details.aspx?FamilyID=86b3d32b-ad26-4bb8-a3ae-c1637026c3ee&displaylang=en

      【讨论】:

        【解决方案4】:

        第一个近似值,如果文件位于不同的磁盘上会有所帮助,否则会降低速度(由于查找所花费的时间增加)。

        如果所有文件都被缓存,可能会稍微快一些(因为您可以使用多个内核)。

        当然,最好的选择是运行一些基准测试。

        【讨论】:

          【解决方案5】:

          您并不是在执行并行 File.Read,而是在并行执行多个 File.Read。如果文件位于不同的轴中,您只需同时使用多个轴即可体验到更高的吞吐量。

          即使您使用单个主轴,如果每次读取之后都执行 CPU 密集型处理,您也可以体验到更高的性能,尽管在这种情况下,调度任务对象会更好。在这种情况下,您可以让一些任务从文件中加载数据,而另一些任务则使用已加载的数据来执行一些繁重的处理。

          【讨论】:

          • 是的,但是如果他的文件在同一个硬盘上,他会达到头部搜索时间,吞吐量会下降2倍以上。请记住,3.5 英寸 7200 RPM 驱动器的平均寻道时间为 13-15 毫秒。与容量和线性读/写速率不同,这个数字在过去几年中是一致的。
          • 这就是为什么我说“每次读取之后都是 CPU 密集型处理”。当一个线程正在读取文件时,另一个线程正在处理,因此它们都在工作。
          【解决方案6】:

          我认为你在这里几乎一针见血。

          一般来说,并行操作总是会在您耗尽资源以并行运行操作时受到限制,但即便如此,随着并行线程数量的增加,您的回报仍然会递减。

          Jeff Atwood 在推特上发布了一个有趣的图表,我稍后将添加到该图表中,显示多线程环境下多核处理器的收益递减。当然,这并不完全相同。但是让我们从这样的想法来看这个,即使你在 100 个硬盘驱动器上有 100 个文件,在某个地方 IO 会被拉回单个通道,这将导致读取增加的一些减少。

          我基本上想说的是,只是并行运行某些东西并不意味着它会显着加快,重要的是要考虑并行进程实际上是如何执行的。

          【讨论】:

            【解决方案7】:

            这是一件棘手的事情。如果你做错了,磁头会来回移动,试图同时读取两个文件。对于较大的文件,这尤其是一个问题。

            但是,如果您并行读取大量小文件,您可能会有所收获,因为磁盘子系统可以选择以不同于您要求的顺序读取文件。然而,我在现实生活中还没有看到这种效果。

            您对内容进行的处理也可以与读取文件同时进行。因此,您需要在发货前进行分析和基准测试。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-09-25
              • 1970-01-01
              • 1970-01-01
              • 2016-05-09
              相关资源
              最近更新 更多