0

いくつかの .csv ファイルを読み取る必要があるコンソール アプリケーションがあります。最初の 2 つはかなり軽い (それぞれ約 10,000 レコード) を読むのに問題はありません。しかし、3 番目のもの (かなり重い、約 220 000 レコード) の読み取りを開始すると、「OutOfMemoryException は未処理でした: mscorlib.dll で 'System.OutOfMemoryException' 型の未処理の例外が発生しました」というエラーが発生し続けます。

最初の 2 つの 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 を読み取るためのより良い方法はありますか? ありがとう

4

2 に答える 2

1

行ごとに読み取る必要があります。ReadToEnd は、ファイルの内容全体をメモリにロードするだけです。大きなファイルを取得した場合は、OutOfMemoryException が発生します。

于 2012-10-15T08:24:57.007 に答える
1

考慮すべき点が 2 つあります

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()
于 2012-10-15T08:27:24.803 に答える