我正在尝试将图像存储在数据库中的数据库迁移到数据库中指向硬盘驱动器上文件的记录。我试图使用这种方法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
}
}
}