3

大きなテキスト ファイルを読み取り、C# を使用して 1 行ずつ解析する必要があります。小さなサイズのファイルの場合は簡単に実行できましStreamReaderたが、大きなファイルの操作中にメモリ不足の例外が発生しました。大きなファイルにどのように適応させることができますか?

次のコードはキャッチしOutOfMemoryExceptionます:

using (StreamReader reader = new StreamReader(FileNameWithPath))
{
    while ((line = reader.ReadLine()) != null)
    {
        // Do something here...
    }
}
4

4 に答える 4

10

これは、レイジー ライン リーダーのほとんどの標準コードであり、非常に大きな単一行がない限り、エラーを引き起こすことはありませOutOfMemoryException。あなたも試すことができます:

foreach(var line in File.ReadLines(FileNameWithPath)) {
    // Do something here...
}

よりクリーンになりますが、同じことを行います。したがって、次の 2 つのオプションがあります。

  1. 1つまたは複数の「線」が単に巨大です
  2. 「ここで何かをする」の何かがゆっくりと(または急速に)あなたの記憶を食い尽くしています

後者の方が可能性が高いと思います。

于 2013-01-08T08:17:09.157 に答える
1

これについてはよくわかりませんが、このクラスの.netフレームワークを試してみてください

MemoryMappedFile クラス- メモリ マップト ファイルは、ファイルの内容をアプリケーションの論理アドレス空間にマップします。メモリ マップト ファイルを使用すると、メモリを同時に管理できるため、プログラマは非常に大きなファイルを操作できます。シークを必要とせずに、ファイルへの完全なランダム アクセスが可能になります。メモリ マップト ファイルは、複数のプロセス間で共有することもできます。

于 2013-01-08T08:22:06.723 に答える
0

バッファサイズを指定してはどうですか?

このような。

using (var reader = new StreamWriter(path,false,Encoding.UTF8, 1000))
{
    .....

}
于 2013-01-08T08:31:39.373 に答える
0
using (var inputFile = new System.IO.StreamReader(sourceFilePath))
{
    while (inputFile.Peek() >= 0) {
        string lineData = inputFile.ReadLine();

        // Do something with lineData
    }
}
于 2013-01-08T08:23:48.830 に答える