0

こんにちは、

私の質問は、StreamWriter を使用してデータを書き込むことの非常に基本的な理解に関係しています。次のコードを検討する場合:

            StreamWriter writer = new StreamWriter(@"C:\TEST.XML");
            writer.WriteLine("somestring");
            writer.Flush();
            writer.Close();

ライター オブジェクトがファイル名で初期化されると、それが持っているのはファイルへのポインターだけです。

しかし、文字列を writer オブジェクトに書き込むとき、実際にはファイル全体をロードし、その内容を読み取り、文字列を最後に追加してハンドルを閉じますか?

ばかげた質問ではないことを願っています。これを尋ねるのは、おそらく 0.5 秒ごとに頻繁にファイルに書き込みを行うアプリケーションに出くわしたためで、ファイル サイズは約 1 GB に増加しましたが、ファイルへの書き込みは引き続き行われました。(ロギング)

これにより、CPU 使用率が 100% になる可能性があると思いますか?

私の質問が不明な場合はお知らせください。

前もって感謝します。

4

2 に答える 2

3

実際にファイル全体をロードし、その内容を読み取りますか

フレームワークは、ファイルを開いた後、FileStream.Seekファイル ポインターをファイルの末尾に配置する操作を実行します。これはオペレーティング システムでサポートされており、ファイル データの読み取りまたは書き込みは必要ありません。

そしてハンドルを閉めます

Closeまたはを呼び出すと、ハンドルが閉じられますDispose。どちらも同等です。(便宜上、C#usingステートメントDisposeを利用してスコープを作成し、スコープを終了するときにコンパイラによってへの呼び出しが処理されることに注意してください。)

0.5 秒ごとにファイルに

これは、マシンを 100% ロードするのに十分な頻度ではないように思えます。特に、ディスク I/O は主にディスク上での待機で構成されているため、この種の待機は CPU 使用率には影響しません。プロファイラーを使用して、アプリケーションがどこで時間を費やしているかを確認します。または、デバッガーで実行し、[一時停止] をクリックして、スレッドのコール スタックを調べる簡単な手法を試すこともできます。アプリケーションをランダムに一時停止すると、多くの時間を消費しているメソッドがスタックにある可能性が高くなります。

于 2010-11-11T23:53:45.360 に答える
0

上記のコードはファイルの内容を上書きするため、事前にファイルをロードする必要はありません。
それにもかかわらず、次のように言ってファイルに追加できます。

StreamWriter writer = new StreamWriter(@"C:\TEST.XML", true);

trueパラメータは、ファイルに追加するように指示することです。
それでも、追加する前にファイル全体をメモリにロードするわけではありません。
これが「ストリーム」と呼ばれる理由です。つまり、一方通行なら一方通行です。

于 2010-11-11T23:21:39.827 に答える