我正在尝试将数据库中存储了图像的数据库迁移到数据库中指向硬盘驱动器上文件的记录。我试图使用这种方法来Parallel.ForEach
加快查询速度,以查询出数据。
但是,我注意到我遇到了OutOfMemory
异常。我知道Parallel.ForEach
将查询一批可枚举的对象,以减少开销(如果有一个用于将查询间隔开)(因此,如果您一次执行一堆查询而不是将它们间隔开,那么您的源将更有可能将下一条记录缓存在内存中出来)。问题是由于我返回的记录之一是一个1-4Mb字节数组,缓存导致整个地址空间用完(该程序必须以x86模式运行,因为目标平台将是32位机)
有什么方法可以禁用缓存或使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
}
}
}
ParallelOptions.MaxDegreeOfParallelism
值会有帮助吗?