1

大規模で予測不可能なファイルを解析するプログラムを作成しています。この部分は問題ありません。私は以下のコードを使用しており、ドキュメントの最後まで ReadLine をループして、メモリ フットプリントを低く抑えています。私の問題はOutOfMemoryException、行が単に長すぎる場合です。

System.IO.StreamReader casereader = new System.IO.StreamReader(dumplocation);
string line;
while ((line = casereader.ReadLine()) != null)
{
    foreach (Match m in linkParser.Matches(line))
    {
        Console.Write(displaytext);
        Console.WriteLine(m.Value);
        XMLWrite.Start(m.Value, displaytext, dumplocation, line);
    }
}

XMLWrite は、正規表現関数に一致する任意の文字列を XML ドキュメントに書き込みます。正規表現機能は、単純な電子メール検索です。この問題は、ReadLine が呼び出され、アプリケーションが読み取り中のファイルに非常に長い行を見つけたときに発生します (これは、タスク マネージャーのメモリ使用量が、文字列 'line' を入力するにつれて上昇し、上昇することからわかります)。最終的にはメモリ不足になり、クラッシュします。私がやりたいことは、事前に定義されたブロック (たとえば 8,000 文字) を読み取り、これらを一度に 1 つずつ同じプロセスで実行することです。これは、文字列行の長さ (8,000 文字) を常に把握し、メモリ不足の例外を受け取ってはならないことを意味します。俺の論理は論理に見える!? 現在、ReadBlock を機能させることができないため、ReadBlock を実装する最良の方法を探しています。

どんな助けでも大歓迎です!

4

3 に答える 3

1

このコードで試すことができます

            using (StreamReader sr = new StreamReader(yourPath)) 
            {
                //This is an arbitrary size for this example.
                char[] c = null;

                while (sr.Peek() >= 0) 
                {
                    c = new char[5];//Read block of 5 characters
                    sr.Read(c, 0, c.Length);
                    Console.WriteLine(c); //print block
                }
            }

リンク: http: //msdn.microsoft.com/en-us/library/9kstw824.aspx

于 2012-08-07T15:45:53.250 に答える
1

行 = buffer.ToString(); この声明は非難されるべきです。buffer は char 配列であり、その ToString() メソッドは単に System.char[] を返します。

于 2012-08-07T15:53:41.440 に答える
-1

使用: line= new string(buffer); その代わり

于 2016-08-21T21:12:36.837 に答える