我正在尝试优化为SSD磁盘创建大量小文件的性能。
ConcurrentBag<串[]> cb = new ConcurrentBag< string []>();cb.AsParallel()。ForAll(fa => File ….
实际上,多个同时进行的IO操作可以减慢很多事情,特别是在传统磁盘上。我推荐使用 ConcurrentQueue 用于编写多个文件。
ConcurrentQueue
你也可以切换到 StreamWriter 和控制缓冲区大小以提高写入速度:
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表达式返回