Я пытаюсь перенести базу данных, в которой изображения хранятся в базе данных, в запись в базе данных, указывающую на файл на жестком диске. Я пытался использовать Parallel.ForEach
чтобы ускорить процесс, используя этот метод для запроса данных.
Однако я заметил, что получаю исключение OutOfMemory
. Я знаю, что Parallel.ForEach
будет запрашивать партию перечислимых элементов, чтобы уменьшить стоимость накладных расходов, если есть такая для интервалов между запросами (так что ваш источник, скорее всего, будет иметь следующую кэшированную запись в памяти, если вместо этого вы выполните сразу несколько запросов интервал их). Проблема связана с тем, что одна из записей, которые я возвращаю, - это байтовый массив размером 1-4 Мб, из-за которого из-за кэширования используется все адресное пространство (программа должна работать в режиме 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
}
}
}