【问题标题】:How to optimize C# concurrent file write performance如何优化 C# 并发文件写入性能
【发布时间】:2015-08-04 14:13:24
【问题描述】:

我正在尝试优化将大量小文件创建到 SSD 磁盘的性能。

ConcurrentBag<string[]> cb = new ConcurrentBag<string[]>();
cb.AsParallel().ForAll(fa => File.WriteAllText(fa[0], fa[1]));

ConcurrentBag&lt;string[]&gt; 的总计数 = 80048,cb.Sum(gbc =&gt; Encoding.UTF8.GetByteCount( gbc[1] ) ); 返回 393441217 字节。

我在其他地方创建了一个 xml.Save();,它创建了一个 ~750MB 的文件。

第一种情况需要 3 分 30 秒才能完成。第二个20秒。

我知道处理所有单独的写入操作需要一些开销,但 3 分 30 秒似乎仍然有点长。我已经尝试过使用 forall 进行并行化,这很有帮助(在此之前需要 6-8 分钟才能完成)。我可以在代码中添加哪些其他修改来优化批量文件创建的性能?

【问题讨论】:

  • 你可以从线程并发写入磁盘,但它是在单个流中写入磁盘的,所以我在写这个问题时没有意识到这一点

标签: c# parallel.foreach solid-state-drive writealltext


【解决方案1】:

实际上,多个同时进行的 IO 操作会大大降低速度,尤其是在传统磁盘上。我建议使用ConcurrentQueue 来编写多个文件。

您也可以切换到StreamWriter 并控制缓冲区大小以提高写入速度:

    ConcurrentQueue<string[]> concurrentQueue = new ConcurrentQueue<string[]>();

    // populate with some data
    for (int i = 0; i < 5000; i++)
    {
        concurrentQueue.Enqueue(new string[] { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() });
    }

    while (true)
    {
        string[] currentElement;
        bool success = concurrentQueue.TryDequeue(out currentElement);
        if (success)
        {
            const int BufferSize = 65536;  // change it to your needs
            using (var sw = new StreamWriter(currentElement[0], true, Encoding.UTF8, BufferSize))
            {
                sw.Write(currentElement[1]);
            }
        }
    }

【讨论】:

  • 如何确定合适的缓冲区大小?这不是传统磁盘而是 SSD,是否应该首先确定...您有 File.WriteAllText 或 StreamWriter 的并发队列示例吗?我也尝试使用 buffersize = 16384 (4*default) 但这导致了内存不足异常
  • 我仍然鼓励您切换到 ConcurrentQueue,我将通过示例更新我的答案。 SSD 也受到影响(但要少得多)。见technet.microsoft.com/en-us/library/cc938632.aspx 和stackoverflow.com/questions/8803515/…
【解决方案2】:

您还应该尝试使用 ForEach 而不是 ForAll。 你可以在http://reedcopsey.com/2010/02/03/parallelism-in-net-part-8-plinqs-forall-method/的帖子中找到一些很好的理由

发帖准则是

ForAll 扩展方法只能用于处理 并行查询的结果,由 PLINQ 表达式返回

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 2018-03-05
    相关资源
    最近更新 更多