【发布时间】:2011-01-10 20:07:52
【问题描述】:
我有一个可爱的任务,就是研究如何处理加载到我们应用程序的脚本编辑器中的大文件(就像我们内部产品的快速宏的 VBA)。大多数文件大约为 300-400 KB,可以很好地加载。但是当它们超过 100 MB 时,这个过程就会变得很困难(正如您所期望的那样)。
发生的情况是文件被读取并推入一个 RichTextBox,然后进行导航 - 不要太担心这部分。
编写初始代码的开发人员只是使用 StreamReader 并在做
[Reader].ReadToEnd()
这可能需要很长时间才能完成。
我的任务是分解这段代码,将其分块读取到缓冲区中,并显示一个进度条,其中包含取消它的选项。
一些假设:
- 大多数文件大小为 30-40 MB
- 文件的内容是文本(不是二进制),有些是 Unix 格式,有些是 DOS。
- 检索到内容后,我们会计算出使用的终止符。
- 一旦加载,它在richtextbox 中呈现所花费的时间就没有人关心了。这只是文本的初始加载。
现在回答问题:
- 我是否可以简单地使用 StreamReader,然后检查 Length 属性(即 ProgressMax)并发出读取设置的缓冲区大小,并在后台工作程序内的 while 循环中迭代 WHILST,所以它不会'不阻塞主 UI 线程?完成后将字符串生成器返回到主线程。
- 内容将转到 StringBuilder。如果长度可用,我可以用流的大小初始化 StringBuilder 吗?
这些(在您的专业意见中)是好主意吗?过去我在从 Streams 读取内容时遇到了一些问题,因为它总是会丢失最后几个字节或其他内容,但如果是这种情况,我会问另一个问题。
【问题讨论】:
-
30-40MB 脚本文件?圣鲭鱼!我不想不得不对代码进行审查......
-
我知道这个问题已经很老了,但前几天我发现了它并测试了 MemoryMappedFile 的推荐,这是最快的方法。比较是通过 readline 方法读取 7,616,939 行 345MB 文件在我的机器上需要 12 多个小时,而通过 MemoryMappedFile 执行相同的加载和读取需要 3 秒。
-
这只是几行代码。请参阅我用来读取 25gb 和更大文件的这个库。 github.com/Agenty/FileReader
标签: c# .net stream streamreader large-files