私のプログラムはファイルからxバイトを読み込み、それらがすべて0であるかどうかをチェックし、20.000ファイルのプロセスを繰り返し、ゼロ以外のバイトを持つファイルのリストを保持します。 パフォーマンスを監視しようとすると、定義可能な各ファイル(バイトサイズ)に対してチェックするバイト数を作成しました。最初の実行後にBinaryReaderが30倍高速になりました。バイト配列はまだメモリにありますか?
問題は、プログラムの最初の実行で完了までに5分(byteSize = 8192)かかりますが、プログラムを閉じて再起動しても10秒しかかかりませんが、だから私の心に来る唯一の原因は、バイト配列がメモリに残っていることです。
BinaryReaderは "using"ディレクティブの下にあります。つまり、ループが完了した後でストリームを閉じる必要があることがわかっている限りです。なぜバイト配列が残っているのですか?どうすれば削除できますか?私はprogを実行するたびに実際のパフォーマンスを測定するためにそれを行う必要があります。
byte[] readByte = new byte[byteSize];
for (int i = 0; i < readCycles; i++)
{
using (BinaryReader reader = new BinaryReader(new FileStream(file, FileMode.Open, FileAccess.Read)))
{
reader.BaseStream.Seek(8192 + i * byteSize, SeekOrigin.Begin);
reader.Read(readByte, 0, byteSize);
}
foreach (byte b in readByte)
{
if (b != 0)
{
allZeros = false;
break;
}
else
allZeros = true;
}
if (allZeros == false) break;
}
プロセスを再起動した後、アプリケーションによってバイト配列がそのように回復可能な方法はありません。おそらくあなたが経験しているのは、オペレーティングシステムのファイルキャッシュです。 – itsme86
*配列*はメモリに残っていません(これはプロセスの再起動には影響しませんが、*ファイル*の内容は変わりません)。 Windowsには、そのようなもののための独自のファイルシステムキャッシュがあります。実行するたびに新しいファイルを作成すると、それが解決されます。 –