Member 10236682 Ответов: 3

System.outofmemoryexception при использовании запуска потока


Я использую threds для обработки xml файлов
для(i=0;i<200;i++)
{
Thread thread1 = new Thread(() => ProcessParadotProspect(dsXMLData, strFileName));
thread1.Начать();

Thread thread2 = new Thread(() => ProcessVistorActivity(dsXMLData, prospect_id, strFileName));
thread2.Начать();

Thread thread3 = new Thread(() => ProcessListSubscription(dsXMLData, prospect_id, strFileName));
thread3.Начать();
}
но уже через 2 минуты система заработала.OutOfMemoryException идет

пожалуйста, скажите мне, как решить эту проблему

Что я уже пробовал:

я перепробовал так много постов в поиске google но не получил правильного решения пожалуйста помогите в этом отношении

Richard MacCutchan

Не создавайте так много потоков.

3 Ответов

Рейтинг:
2

OriginalGriff

Это создает 600 потоков, и что именно делают сами потоки, мы понятия не имеем.
Но...каждый поток требует стека, который по умолчанию представляет собой непрерывный блок размером 1 МБ - так что этим потокам (без чего-либо, что они могут создавать) потребуется 600 непрерывных блоков размером 1 МБ из памяти вашего процесса, прежде чем что - либо еще будет подсчитано. В зависимости от используемой системы вы можете начать испытывать проблемы, если приложение делает что-то еще, так как некоторые из них ограничены общим объемом процесса 2 ГБ.

Зачем создавать их так много? Как вы думаете, у вас есть 600 ядер, чтобы запустить их? Создание большего количества потоков, чем ядер, обычно замедляет общую пропускную способность, а не ускоряет ее, поскольку это значительно увеличивает накладные расходы на переключение задач. Я бы начал с рассмотрения того, что вы делаете, что, по вашему мнению, требует такого количества одновременных потоков, а затем посмотрите, что делают сами фактические потоки.

Извините, но мы ничего не можем сделать для вас!


Рейтинг:
2

Patrice T

Возможно, я ошибаюсь, но мне кажется, что вы запускаете 200 раз по 3 потока с одинаковыми параметрами каждый раз.
Вы уверены, что не делаете 200 раз одну и ту же работу ?
Насколько я вижу, 3 потока обрабатывают 200 раз одно и то же имя файла.
Я что-то пропустил ?


Рейтинг:
1

Mehdi Gholam

Предположительно методы следует делать один за другим и не параллельно, а использовать Taskвместо того, чтобы так попробовать:

for(i=0;i<200;i++)
{
    Task.Factory.StartNew( () => {
        ProcessParadotProspect(dsXMLData, strFileName);
        ProcessVistorActivity(dsXMLData, prospect_id, strFileName);
        ProcessListSubscription(dsXMLData, prospect_id, strFileName)
    });
}