簡體   English   中英

如何優化C#並發文件寫入性能

[英]How to optimize C# concurrent file write performance

我正在嘗試優化將大量小文件創建到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字節。

我在其他地方做一個xml.Save(); ,這會創建一個約750MB的文件。

第一種情況需要3分30秒才能完成。 第二秒。

我知道處理所有單獨的寫操作會有一些開銷,但是3分30秒似乎還有些長。 我已經嘗試過使用forall進行並行化,這非常有效(在此之前需要6-8分鍾才能完成)。 我可以對代碼進行哪些其他修改以優化批量文件創建的性能?

實際上,多個同時進行的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]);
            }
        }
    }

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

職位指南是

ForAll擴展方法僅應用於處理由PLINQ表達式返回的並行查詢的結果

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM