3

大きなファイルを解析する必要があるため、次のようにする代わりに:

 string unparsedFile = myStreamReader.ReadToEnd(); // takes 4 seconds
 parse(unparsedFile); // takes another 4 seconds

最初の 4 秒を利用して、次のようにして両方のことを同時に実行したいと考えています。

        while (true)
        {
            char[] buffer = new char[1024];

            var charsRead = sr.Read(buffer, 0, buffer.Length);

            if (charsRead < 1)
                break;

            if (charsRead != 1024)
            {
                Console.Write("Here");  // debuger stops here several times why?
            }

            addChunkToQueue(buffer); 
        }

int counterこれがデバッガーの画像です: ( 1024バイト未満を読み取った反復を示すために追加しました)

ここに画像の説明を入力

1024文字ではなく643文字が読み取られることに注意してください。次の反復で次のようになります。

ここに画像の説明を入力

残りのバイトが 1024 未満になる最後の反復に到達するまで、常に 1024 バイトを読み取る必要があると思います。

だから私の質問は 、whileループを繰り返しスローするときに、「ランダムな」数の文字を読み取るのはなぜですか?


編集

どのようなストリームを扱っているかわかりません。次のようなプロセスを実行します。

        ProcessStartInfo psi = new ProcessStartInfo("someExe.exe")
        {
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            UseShellExecute = false,
            CreateNoWindow = true,
        };

        // execute command and return ouput of command
        using (var proc = new Process())
        {
            proc.StartInfo = psi;
            proc.Start();                               

            var output = proc.StandardOutput;  //  <------------- this is where I get the strem

            //if (string.IsNullOrEmpty(output))
            //output = proc.StandardError.ReadToEnd();

            return output;
        }
    }
4

3 に答える 3

4

1 つには、バイトではなく文字を読み取っています。大きな違いがあります。

必ずしもすべてを一度に読み取るとは限らない理由については、利用可能なデータがそれほど多くない可能StreamReader性があり、バッファを埋めるために不確定な時間ブロックするのではなく、取得したものを提供することを決定した可能性があります。そうすることは完全にその権利の範囲内です。

これはローカル ファイルからのものですか、それともネットワーク経由ですか? 通常、ローカル ファイル操作は、ネットワーク ダウンロードよりもバッファーをいっぱいにする可能性が高くなりますが、いずれにしても、バッファーがいっぱいになることに依存するべきではありません。それが「ファイル」(つまり、を使用して読み取るFileStream) であるが、たまたまネットワーク共有上にある場合... まあ、それは私の知る限り灰色の領域です:) それはストリームです-そのように扱います。

于 2012-07-02T18:58:05.700 に答える
3

読んでいる実際のストリームによって異なります。これがファイル ストリームの場合、「部分的な」データを取得する可能性は低いと思います。ただし、ネットワーク ストリームから読み取る場合は、データが異なる長さのチャンクになることを期待する必要があります。

于 2012-07-02T18:58:41.983 に答える
2

ドキュメントから: http://msdn.microsoft.com/en-us/library/9kstw824

Read メソッドを使用する場合は、ストリームの内部バッファーと同じサイズのバッファーを使用し、内部バッファーを目的のブロック サイズに設定し、常にブロック サイズよりも小さい値を読み取る方が効率的です。ストリームの構築時に内部バッファのサイズが指定されていなかった場合、デフォルトのサイズは4 キロバイト (4096 バイト)です。バッファーにデータを読み取った後に基になるストリームの位置を操作すると、基になるストリームの位置が内部バッファーの位置と一致しない場合があります。内部バッファをリセットするには、DiscardBufferedData メソッドを呼び出します。ただし、このメソッドはパフォーマンスが低下するため、絶対に必要な場合にのみ呼び出す必要があります。

したがって、戻り値については、ドキュメントには次のように記載されています。

読み取られた文字数 。ストリームの最後でデータが読み取られなかった場合は 0。データがストリーム内で使用可能かどうかに応じて、数値は count パラメーター以下になります。

または、要約すると、バッファーと基になるバッファーは同じサイズではないため、基になるバッファーがまだいっぱいになっていないため、バッファーが部分的にいっぱいになります。

于 2012-07-02T18:59:21.173 に答える