将大文件加载到String Variable VB.NET中

0 vb.net

问题,如果有人可以提供帮助inPath请求:我正在阅读的文件非常大300MB到1 GB +.我需要将文件加载到变量中wholeFile,如下面的程序所示.大约200 MB的文件工作正常,但更大的文件炸弹(内存异常错误).目的是一旦文件被加载到变量中,我将需要运行RegEx并选择文件的某些部分并保存到其他地方.再次感谢您的关注.

Dim inPath As String = "C:\temp\300MB-File.txt" 
Dim outPath As String = "C:\temp\myFileNew2.txt"

        Dim wholeFile as String = ""

        Using sw As StreamWriter = File.CreateText(outPath)
            For Each oneLine As String In File.ReadLines(inPath)
                sw.WriteLine(oneLine)

                wholeFile = wholeFile & vbCrLf & oneLine

            Next 
    End Using
Run Code Online (Sandbox Code Playgroud)

jmc*_*ney 7

你这样做的方式是可恶的.如果您的目的是将整个内容存储在单个变量中,为什么还要逐行读取文件?为什么不一次加载整个文件?

Dim fileContents = File.ReadAllText(filePath)
Run Code Online (Sandbox Code Playgroud)

这可能仍然存在大文件的内存问题,但您正在使用的方式将使用指数级更多的内存.每次连接时String,都会创建一个新String对象,并将之前的内容与新文本一起复制到其中.这意味着,对于具有N个行的文件,你要创建n个Strings.第一行将包含第一行,第二行将包含前两行,然后第三行将包含前三行,等等.

如果你真的想逐行读取文件,那么你可以使用a StringBuilder,这可以避免如此多的内存重新分配.更好的方法是首先获取文件的大小,然后StringBuilder从get go 创建具有适当容量的文件,因此根本不需要重新分配.

但是当你接下来的时候,那个大小的文件无论如何都会成为一个问题.您需要确保为应用程序分配足够的内存来处理它,否则您必须将文件分成块并分别处理每个块.如果你的正则表达式与文件的非常大的部分不匹配,那么你可以简单地使每个块重叠一两行,然后处理重叠部分中重复匹配的特殊情况.