Ограничения использования памяти на количество потоков с использованием PLINQ

Я использую PLINQ для параллелизации данных в операции. Каждый поток потребляет очень большой объем памяти, который зависит от настроек алгоритма, и нет простого способа предварительно рассчитать, сколько памяти потребуется, основываясь на параметрах алгоритма. Когда требования к памяти низки, оптимальное количество потоков составляет 7 из общего количества системы 8; когда требования к памяти высоки, 2 потока - это значительное улучшение по сравнению с 1, но после использования 3 потоков система начинает загружать файл подкачки, и загрузка ЦП падает до 0, а производительность ухудшается в сотни раз.

Я хотел бы, чтобы PLINQ постепенно увеличивал число потоков, одновременно следя за загрузкой памяти, и как только система исчерпала доступную физическую память, установите токен отмены в последнем потоке, чтобы он мог откатывать свою память, позволяя другим потокам работать оптимально.

Любые идеи о том, как вывести это поведение из PLINQ, или мне нужно полностью отказаться?

1 ответ

PLINQ использует TreadPool Темы (по умолчанию TaskScheduler а также TaskFactory) так что вы можете использовать ThreadPool.SetMaxThreads(#N, #Q) контролировать количество потоков на основе текущего потребления памяти вашего приложения.

Но мне кажется, что потребление памяти такого масштаба - это приложение, может быть, его следует переделать и перенести в другой модуль (например, в базу данных - облегченную RDBMS или NoSQL - или в систему кэширования) - всего лишь предложение.

Другие вопросы по тегам