작업을 병렬로 처리하는 메모리 사용량이 많은 응용 프로그램과 함께 작업하고 있습니다. 문제는 많은 메모리를 생성 한 다음 GC가 멈출 때까지 16GByte 시스템에 과부하가 걸린다는 것입니다. 이 시점에서 성능은 끔찍하며 끝내려면 며칠이 걸릴 수 있습니다. 원래 응용 프로그램을 실행하는 데 일반적으로 30 분이 걸립니다.메모리가 많은 멀티 스레드 응용 프로그램
class Program
{
static void Main(string[] args)
{
var tasks = new List<Task<string[]>>();
var report = new List<string>();
for (int i = 0; i < 2000; i++)
{
tasks.Add(Task<string[]>.Factory.StartNew(DummyProcess.Process));
}
foreach (var task in tasks)
{
report.AddRange(task.Result);
}
Console.WriteLine("Press RETURN...");
Console.ReadLine();
}
}
여기에 '프로세서'입니다 :
public static class DummyProcess
{
public static string[] Process()
{
var result = new List<string>();
for (int i = 1; i < 10000000; i++)
{
result.Add($"This is a dummy string of some length [{i}]");
}
var random = new Random();
var delay = random.Next(100, 300);
Thread.Sleep(delay);
return result.ToArray();
}
}
저는 믿습니다 문제는 여기에 있습니다 :
foreach (var task in tasks)
{
report.AddRange(task.Result);
}
하는하는 작업은 배치하지 않는 이것은이의 버전을 박탈하다 작업이 끝나면 결과 (문자열 [])를 작업에서 가져 와서 작업을 처리하는 가장 좋은 방법은 무엇입니까?
foreach (var task in tasks)
{
report.AddRange(task.Result);
task.Dispose();
}
그러나 많은하지 차이 :
나는 이것을 시도했다. 내가 시도 할 수도있는 것은 반환되는 결과를 단순히 멈추는 것이다. 즉, 문자열의 거대한 10 - 50 MBytes가 원래 응용 프로그램에서 유지되지 않는다.편집 : 나는 다음과 같이 결과를 읽을 수있는 코드를 교체 시도 :
나는 두 시간 후에 중단했다while (tasks.Any())
{
var listCopy = tasks.ToList();
foreach (var task in listCopy)
{
if (task.Wait(0))
{
report.AddRange(task.Result);
tasks.Remove(task);
task.Dispose();
}
}
Thread.Sleep(300);
}
- 나는 그것을 하루 아침에 오늘 밤을 실행 드리겠습니다과이 완료되는지 확인합니다. 메모리 사용량은 달렸지 만 느린 속도로 나아졌습니다.