c#打开和读取流的速度很慢

本文关键字:速度 读取 | 更新日期: 2023-09-27 18:08:15

我有22k的文本(rtf)文件,我必须附加到最后一个。

代码看起来像这样:

    using (TextWriter mainWriter = new StreamWriter(mainFileName))
    {
        foreach (string currentFile in filesToAppend)
        {
            using (TextReader currentFileRader = new StreamReader(currentFile))
            {
                string fileContent = currentFileRader.ReadToEnd();
                mainWriter.Write(fileContent);
            }
        }
    }

显然,这会打开22k倍的流来读取文件。

我的问题是:

1)一般来说,打开流是一个缓慢的操作吗?从流中读取是一个慢的操作吗?

2)如果我读取文件作为byte[]并将其附加为byte[],那么使用文件文本是否有任何差异?

3)有没有更好的办法来合并22k的文件?

谢谢。

c#打开和读取流的速度很慢

1)一般来说,打开流是一个缓慢的操作吗?

不,一点也不。打开流非常快,只需要从底层操作系统保留一个句柄。

2)如果我读取文件为byte[]并附加它,会有什么不同吗作为字节[]比使用文件文本?

当然,它可能会快一点,而不是使用一些编码将字节转换为字符串,但是与我在下一点中建议的方法相比,改进可以忽略不计(特别是如果您处理的是非常大的文件)。

3)有什么方法可以更好地实现这一点?(合并22k文件)

是的,不要在内存中加载每个文件的内容,只需要读入数据块并将其输出到输出流:

using (var output = File.OpenWrite(mainFileName))
{
    foreach (string currentFile in filesToAppend)
    {
        using (var input = File.OpenRead(currentFile))
        {
            input.CopyTo(output);
        }
    }
}

在我的例子中,BCL中的Stream.CopyTo方法将负责繁重的工作。

可能加快速度的最佳方法是确保输出文件位于与输入文件不同的物理磁盘驱动器上。

另外,您可以通过创建带有大缓冲区的输出文件来提高速度。例如:

using (var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None, BufferSize))
{
    using (var mainWriter = new StreamWriter(fs))
    {
        // do your file copies here
    }
}

也就是说,您的主要瓶颈将是打开文件。如果这22,000个文件都在同一个目录中,尤其是正确的。NTFS在处理大型目录时存在一些问题。最好将一个大目录分成22个目录,每个目录有1000个文件。在包含数万个文件的目录中打开一个文件比在只有几百个文件的目录中打开一个文件要慢得多。

从文件中读取数据速度慢的原因是你没有在电子周围移动,电子可以以…非常快。要读取文件中的信息,你必须旋转这些金属磁盘,并使用磁铁读取其中的数据。这些圆盘旋转的速度远低于电子通过电线传播信号的速度。不管你在代码中使用什么机制来告诉这些磁盘旋转,你仍然需要等待它们旋转,这将花费时间。

将数据作为字节还是文本处理并不特别重要。