最佳答案
我试图迁移数据库中的图像存储在数据库中的一个记录在数据库中指向一个文件的硬盘驱动器。我试图使用 Parallel.ForEach
来加快 使用这种方法查询数据的过程。
但是,我注意到我得到了一个 OutOfMemory
异常。我知道 Parallel.ForEach
会查询一批可枚举数,以减少开销,如果有一个间隔的查询(所以你的源将更有可能有下一个记录缓存在内存中,如果你一次做一堆查询,而不是间隔)。这个问题是由于我返回的一个记录是一个1-4Mb 字节数组,缓存导致整个地址空间被用完(程序必须在 x86模式下运行,因为目标平台将是一台32位机器)
有没有什么方法可以禁用缓存或者对于 TPL 来说 make 更小?
下面是一个示例程序来说明这个问题。这必须在 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
}
}
}