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

时间:2016-11-12 02:12:07

标签: 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

1 个答案:

答案 0 :(得分:7)

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

Dim fileContents = File.ReadAllText(filePath)

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

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

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