0

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

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

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

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

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

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

4

2 回答 2

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]);
            }
        }
    }
于 2015-08-04T14:31:11.340 回答
1

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

发布指南是

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

于 2015-08-04T14:43:40.100 回答