我正在尝试将数据库中存储的图像迁移到指向硬盘上文件的数据库记录。我试图使用
Parallel.ForEach
来加速这个过程,使用此方法查询数据。但是,我发现我得到了一个OutOfMemory
异常。我知道Parallel.ForEach
会查询一批可枚举对象以减少开销的成本,如果有一个用于间隔查询的开销(因此,如果您一次执行大量查询而不是将它们分散开来,源代码更可能在内存中缓存下一个记录)。问题是我返回的其中一个记录是一个1-4MB的字节数组,缓存导致整个地址空间被耗尽(程序必须在x86模式下运行,因为目标平台将是32位机器)。是否有任何方法可以禁用TPL的缓存或使其更小?以下是一个示例程序,用于演示此问题。如果需要太长时间或在您的计算机上没有发生此问题,请增加数组大小(我发现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
}
}
}
ParallelOptions.MaxDegreeOfParallelism
值会有帮助吗? - Kevin Pullin