首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优化C#并发文件写入性能

如何优化C#并发文件写入性能
EN

Stack Overflow用户
提问于 2015-08-04 14:13:24
回答 2查看 1.4K关注 0票数 0

我试图优化为SSD磁盘创建大量小文件的性能。

代码语言:javascript
运行
复制
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();,它创建了一个~750 do文件。

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

我知道有一些开销来处理所有独立的写操作,但是3分30秒似乎仍然有点长。我已经尝试了forall的并行化,它帮助了相当好(在此之前,它花了6-8分钟完成)。我还可以在代码中添加哪些其他修改来优化大容量文件创建的性能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-04 14:31:11

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

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

代码语言:javascript
运行
复制
    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]);
            }
        }
    }
票数 1
EN

Stack Overflow用户

发布于 2015-08-04 14:43:40

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

职位指引是

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31811675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档