[英]C# Performance - Chunking Write of file with AppendAllText
[英]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.