Как прикрутить многопоточную обработку без проблем с памятью?



@Student2002

Здравствуйте , есть функция которая в отдельном потоке генерирует много много строк . (очень много, хранить их в List не вариант так как крашится)
Как мне отдельно создать потоки чтоб они брали результат работы и обрабатывали ?
Пробовал сделать что-то вроде

private void Generator()
{
// Тут он её генерирует
string value = "Строка которую он сгенерировал в чуть выше";
                    Thread a = new Thread(new ParameterizedThreadStart(Get_Obrabotka));
                    a.Start(value);
}

Крашится System.OutOfMemoryException».»


Решения вопроса 1



@2ord

Генерацию самих строк стоит оформить как IEnumerable, а их обработку — при помощи Task.

Комментировать

Ответы на вопрос 4



@kttotto

Если памяти не хватает, то без разницы сколько потоков Вы используете. Многопоточность нужна либо для асинхронности, либо для параллельности. Добавление потоков памяти не сэкономит, даже наоборот, увеличит ее расход и даже иногда скорости не добавляет.

Если у Вас есть некий список, с которым работает много потоков, то рассмотрите возможность использования потокобезопасных коллекций. List не потокобезопасен.

Если у Вас большой объем данных, который не влазит в память, то только подгружать данные частями, если хотите добавить параллельную обработку этих данных в разных потоках, то ,возможно, Вам подойдет Parallel.ForEach.

И да, нет необходимости добавлять 100 потоков, как уже сказали, такое кол-во в кол-во ядер не влезет и производительности это не добавит, а даже наоборот, т.к. одно ядро будет делить время на часть выделенных потоков и будет переключать контекст между ними. Не факт, конечно, что даже два потока будут разделены по ядрам, за это ОС отвечает, но 100 потоков, это кажется перебором. Можно, конечно поэкспериментировать с кол-вом и посмотреть на производительность при этом.



@MANAB

Паттерн поставщик-потребитель



@soloveid

Без просмотра кода все советы вообще ни о чём.
Скорее всего генерация строк идёт быстрее чем их обработка.
И скорее всего идёт неправильная (не оптимальная по памяти и производительности)
обработка, возможно вообще всё может работать сильно быстрее и без всяких потоков.



@cicatrix

Не создавай много потоков.
Если хочешь заморочиться, то можно отслеживать состояние памяти процесса и регулировать их количество. Если не заморачиваться, то прирост производительности от параллельного исполнения ограничен количеством ядер процессора.
То, что ты описал, подходит под паттерн — производитель-потребитель.
Пример реализации

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *