Задать вопрос

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

Здравствуйте , есть функция которая в отдельном потоке генерирует много много строк . (очень много, хранить их в List не вариант так как крашится)
Как мне отдельно создать потоки чтоб они брали результат работы и обрабатывали ?
Пробовал сделать что-то вроде
private void Generator()
{
// Тут он её генерирует
string value = "Строка которую он сгенерировал в чуть выше";
                    Thread a = new Thread(new ParameterizedThreadStart(Get_Obrabotka));
                    a.Start(value);
}

Крашится System.OutOfMemoryException"."
  • Вопрос задан
  • 386 просмотров
Подписаться 4 Простой 5 комментариев
Решения вопроса 1
2ord
@2ord
Генерацию самих строк стоит оформить как IEnumerable, а их обработку - при помощи Task.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@kttotto
пофиг на чем писать
Если памяти не хватает, то без разницы сколько потоков Вы используете. Многопоточность нужна либо для асинхронности, либо для параллельности. Добавление потоков памяти не сэкономит, даже наоборот, увеличит ее расход и даже иногда скорости не добавляет.

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

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

И да, нет необходимости добавлять 100 потоков, как уже сказали, такое кол-во в кол-во ядер не влезет и производительности это не добавит, а даже наоборот, т.к. одно ядро будет делить время на часть выделенных потоков и будет переключать контекст между ними. Не факт, конечно, что даже два потока будут разделены по ядрам, за это ОС отвечает, но 100 потоков, это кажется перебором. Можно, конечно поэкспериментировать с кол-вом и посмотреть на производительность при этом.
Ответ написан
Комментировать
MANAB
@MANAB
Разрабатываю на C#: Web, Desktop, Gamedev
Паттерн поставщик-потребитель
Ответ написан
Комментировать
@soloveid
Без просмотра кода все советы вообще ни о чём.
Скорее всего генерация строк идёт быстрее чем их обработка.
И скорее всего идёт неправильная (не оптимальная по памяти и производительности)
обработка, возможно вообще всё может работать сильно быстрее и без всяких потоков.
Ответ написан
Комментировать
@cicatrix
было бы большой ошибкой думать
Не создавай много потоков.
Если хочешь заморочиться, то можно отслеживать состояние памяти процесса и регулировать их количество. Если не заморачиваться, то прирост производительности от параллельного исполнения ограничен количеством ядер процессора.
То, что ты описал, подходит под паттерн - производитель-потребитель.
Пример реализации
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы