画像がデータベースに保存されているデータベースを、ハードドライブ上のファイルを指すデータベースのレコードに移行しようとしています。このメソッドを使用してデータをクエリするParallel.ForEach
プロセスを高速化するために使用しようとしていました。
しかし、OutOfMemory
例外が発生していることに気づきました。列挙型のバッチをクエリして、クエリの間隔を空けるためのオーバーヘッドのコストを軽減することを知ってParallel.ForEach
います(したがって、クエリの間隔を空けるのではなく、一度に一連のクエリを実行すると、ソースの次のレコードがメモリにキャッシュされる可能性が高くなりますアウト)。この問題は、返されるレコードの1つが1〜4 Mbバイトの配列であり、キャッシュによってアドレス空間全体が使い果たされていることが原因です(ターゲットプラットフォームは32ビットであるため、プログラムはx86モードで実行する必要があります)マシーン)
キャッシュを無効にする方法や、TPLのサイズを小さくする方法はありますか?
これは、問題を表示するためのサンプルプログラムです。これは、x86モードでコンパイルして、時間がかかるか、マシンで発生していない場合に問題を表示する必要があります。アレイのサイズが大きくなります(マシン1 << 20
で約30秒かかり、4 << 20
ほぼ瞬時に発生しました)
class Program
{
static void Main(string[] args)
{
Parallel.ForEach(CreateData(), (data) =>
{
data[0] = 1;
});
}
static IEnumerable<byte[]> CreateData()
{
while (true)
{
yield return new byte[1 << 20]; //1Mb array
}
}
}