【问题标题】:How to make reading, processing and creating files faster?如何更快地读取、处理和创建文件?
【发布时间】:2016-03-26 02:02:07
【问题描述】:

我有一些示例代码。

        foreach (var currentFile in currentDirectory)
        {
            string[] contents = File.ReadAllText(currentFile).Split('%');
            using (XmlWriter writer = XmlWriter.Create(currentFile.Replace(".txt",".xml")))
            {
                writer.WriteStartDocument();
                writer.WriteStartElement("INFO");
                writer.WriteStartElement("INFO");
                writer.WriteElementString("USER", contents[1]);
                writer.WriteElementString("USERDATA", contents[2]);
                writer.WriteEndElement();
                writer.WriteEndElement();
                writer.WriteEndDocument();
            }
        }

我有这样的文本文件:MYNICKNAME % A LOT OF DATA。 现在我正在尝试使这个程序多线程。我应该挖什么方向?异步/等待?我对多线程真的很陌生。

【问题讨论】:

  • 我们可能需要更多关于您正在尝试做什么的信息。您是否只需要对目录中的所有文件进行一次传递并将每个文件从文本转换为 xml?需要考虑的一件事是您是否是唯一访问这些文件的人。
  • 并行只会使您的进程的 CPU 密集型部分受益。看起来你的很多进程都是 I/O,不会从并行性中受益。所以在处理 1 个文件的同时处理 3 个文件并不是一个现实的目标。
  • 是的,我通过文件传递目录,然后处理它们并制作 xml 文件。所以目录中的每个文本文件都会有一个xml。我试图通过多线程使其更快 2-3 倍
  • 在这种情况下,受磁盘 I/O 限制,并行任务甚至可能使事情变得更糟。
  • async/await 将允许您“一劳永逸”,因此您不必等到一切都完成后再继续,但总体上不会使整个过程更快。跨度>

标签: c# multithreading


【解决方案1】:

您可以将foreach 更改为Parallel.ForEach

示例:How to: Write a Simple Parallel.ForEach Loop

还有一个类似的问题:Read and process files in parallel C#

【讨论】:

  • Parallel.ForEach 不会使其在少量文件上更快。最好处理大量文件
  • 多线程会增加开销,所以这是正常的。正如Luc Morin 所评论的那样:您正在从磁盘读取文件。因此,您的线程正在竞争从同一个磁盘读取。多线程并不是什么神奇的东西,它可以通过你拥有的 CPU 数量来减少你的工作时间。还涉及其他因素。
  • 没有 CPU 密集型工作可以让它更快,对吧?
  • 我添加了一个类似问题的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-26
  • 2017-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
相关资源
最近更新 更多