读取.csv时出现OutOfMemoryException

时间:2012-10-15 08:22:25

标签: .net vb.net csv out-of-memory

我有一个控制台应用程序,我需要读取一些.csv文件。 我没有问题,读取两个第一个(每个约10 000条记录)。 但是当它开始读第三个(方式更重,大约220 000条记录)时,我一直有错误“OutOfMemoryException未处理:mscorlib.dll中发生了'System.OutOfMemoryException'类型的未处理异常”

我不明白看到它对两个第一个csv工作正常......

这是我的函数读取csv文件,错误发生在分割:

Function FileToString(filePath As String) As String()
    Dim myfile As New StreamReader(filePath, System.Text.Encoding.GetEncoding("iso-8859-1"))
    Dim allData As String = myfile.ReadToEnd()
    Dim rows As String() = allData.Split(vbCr.ToCharArray)
    Return rows
End Function

我怎么能阻止这个?有更好的方法来阅读csv吗? 感谢名单

2 个答案:

答案 0 :(得分:1)

你应该逐行阅读,ReadToEnd只会将完整的文件内容加载到内存中,如果你有大文件就会得到OutOfMemoryException

答案 1 :(得分:1)

有两件事需要考虑

1)而不是String使用StringBuilder作为 Dim builder As New StringBuilder

2)对于文件读取,使用缓冲方法而不是myfile.ReadToEnd()

实施例

Function FileToString(filePath As String) As String 
    Dim f As System.IO.FileStream
    Dim mylength As Integer
    Dim i As Integer

    f = New System.IO.FileStreamfilePath, IO.FileMode.Open, IO.FileAccess.Read)

    Dim streamLength As Integer = Convert.ToInt32(f.Length)
    Dim fileData As Byte() = New Byte(streamLength) {}

    f.Read(fileData , 0, streamLength)
    f.Close()
    return fileData.ToString();
End Function 

如果你想逐行,那么使用下面的代码

Dim sr As StreamReader = New StreamReader("TestFile.txt")
Dim line As String
Do
    line = sr.ReadLine()
    Console.WriteLine(Line)
Loop Until line Is Nothing
sr.Close()