gpt4 book ai didi

c# - 在 C# 中使用流读取大文本文件

转载 作者:IT王子 更新时间:2023-10-29 03:37:49 25 4
gpt4 key购买 nike

我有一个可爱的任务,就是研究如何处理加载到我们应用程序脚本编辑器中的大文件(对于我们用于快速宏的内部产品,它类似于 VBA)。大多数文件大约为 300-400 KB,可以很好地加载。但是当它们超过 100 MB 时,这个过程就会很困难(如您所料)。

发生的事情是文件被读取并被插入一个 RichTextBox 中,然后导航 - 不要太担心这部分。

编写初始代码的开发人员只是简单地使用 StreamReader 并执行

[Reader].ReadToEnd()

这可能需要很长时间才能完成。

我的任务是分解这段代码,将其分 block 读入缓冲区并显示一个带有取消选项的进度条。

一些假设:

  • 大多数文件大小为 30-40 MB
  • 文件内容为文本(非二进制),部分为Unix格式,部分为DOS格式。
  • 检索到内容后,我们会计算出使用的终止符。
  • 一旦载入,没人会担心在 richtextbox 中呈现所需的时间。这只是文本的初始加载。

现在回答问题:

  • 我可以简单地使用 StreamReader,然后检查 Length 属性(因此 ProgressMax)并针对设置的缓冲区大小发出 Read 并在后台工作程序内 WHILST 的 while 循环中迭代,这样它就不会'阻塞主 UI 线程?然后在完成后将 stringbuilder 返回到主线程。
  • 内容将转到 StringBuilder。如果长度可用,我可以用流的大小初始化 StringBuilder 吗?

这些(在您的专业意见中)是好主意吗?我过去在从 Streams 读取内容时遇到过一些问题,因为它总是会错过最后几个字节或其他内容,但如果是这种情况,我会问另一个问题。

最佳答案

您可以使用 BufferedStream 提高读取速度,如下所示:

using (FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
using (BufferedStream bs = new BufferedStream(fs))
using (StreamReader sr = new StreamReader(bs))
{
string line;
while ((line = sr.ReadLine()) != null)
{

}
}

2013 年 3 月更新

我最近编写了用于读取和处理(在其中搜索文本)1 GB 左右的文本文件(比此处涉及的文件大得多)的代码,并通过使用生产者/消费者模式实现了显着的性能提升。生产者任务使用 BufferedStream 读取文本行,并将它们交给执行搜索的单独消费者任务。

我以此为契机学习了 TPL Dataflow,它非常适合快速编写此模式。

为什么 BufferedStream 更快

A buffer is a block of bytes in memory used to cache data, thereby reducing the number of calls to the operating system. Buffers improve read and write performance. A buffer can be used for either reading or writing, but never both simultaneously. The Read and Write methods of BufferedStream automatically maintain the buffer.

2014 年 12 月更新:您的里程可能会有所不同

根据评论,FileStream 应该使用 BufferedStream在内部。在首次提供此答案时,我通过添加 BufferedStream 测量到显着的性能提升。当时我的目标是 32 位平台上的 .NET 3.x。今天,针对 64 位平台上的 .NET 4.5,我没有看到任何改进。

相关

我遇到过这样一种情况,即从 ASP.Net MVC 操作将生成的大型 CSV 文件流式传输到响应流的速度非常慢。在此实例中,添加 BufferedStream 可将性能提高 100 倍。有关更多信息,请参阅 Unbuffered Output Very Slow

关于c# - 在 C# 中使用流读取大文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2161895/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com