2016-10-10 2 views
-1

웹 페이지에서 콘텐츠를 스크랩하는 앱을 만들었습니다. 스크래핑 메서드가 다른 스레드에서 실행 중입니다. 1,000 초 동안 1000 개의 웹 페이지에서 콘텐츠를 긁을 수 있다고 가정 해 봅시다.각 루프마다 1 개의 X 스레드를 할당하십시오.

나는 약간의 테스트를 수행했습니다. 내 응용 프로그램을 5 번 실행하고 각 응용 프로그램에 다른 1000 개의 URL을 입력하십시오. 이제 150 초 내에 5000 개의 URL에서 콘텐츠를 스크랩했습니다.

좋아,하지만 매번 5 개 앱을 실행하고 싶지는 않습니다. 루프를 (linklinks 개체에서 얻는 데 사용됩니다) 빠르게하고 싶습니다.

각 링크에 대해 실제로 새 스레드를 사용하지 않습니다. out of memory exception을 제공합니다. 나는 Parallel 루프가 똑같을 것이라고 생각한다.

저는 foreach 루프가 더 빨리 5 ~ 10 회 실행되도록 만들고 싶습니다. 내 코드는 다음과 같습니다.

foreach (Link link in links) 
    scrapeContent(link.url); 

어떻게하면 더 빨리 실행할 수 있습니까? 스레드를 할당하는 것이 최선의 선택일까요?

+4

"병렬 루프가 똑같이 할거라고 생각합니다." --- "사고"대신에 확인하는 것은 어떻습니까? 사실은 항상 가정보다 낫습니다. – zerkms

+0

전반적인 속도는 특정 웹 서버의 느린 응답으로 구분됩니다. 병렬로 여러 요청을 실행하는 경우 대기 시간을 활용하여 처리량을 높일 수 있습니다. 내 접근 방식은 스레드 풀입니다. 시행 착오로 풀 크기를 최적화하십시오. –

+0

모든 코드를 보여줄 수 있다면 정말 좋을 것입니다. 당신이 보여준 작은 비트는 도움이되지 않습니다. 우리는 코드를 실행하고 개선 된 내용과 비교하는 것이 이상적입니다. 코드를 개선하여 질문에 대한 답을 얻을 수 있습니다. – Enigmativity

답변

0

스레드 만들기는 시간과 리소스 (메모리)가 필요하기 때문에 항상 새 스레드를 시작할 수는 없습니다.

대신 스레드 풀을 사용할 수 있습니다. 스레드 풀은 스레드 다이를 댄다 그 threads.Instead을 다시 만들어집니다, 당신은 요청이 들어올 때마다 재사용 할 수있는 풀로 다시 보내

는 다음과 같이 스레드를 사용합니다.

ThreadPool.QueueUserWorkItem((s) =>{ 

//Your method here. 
Console.WriteLine(“Working on a thread from threadpool”); 

}); 
+1

왜'Parallel.ForEach'가 아닌가? – VMAtm

+0

OfCourse 당신은 쓰레드의 재사용을 위해 쓰레드 풀을 사용하는 것을 사용할 수 있습니다. 심지어 태스크 (System.threading.task)도 마찬가지입니다. – Rajput

+0

@VMWith Parallel.Foreach'System.StackOverflowException'이 발생했습니다 – Dawvawd

관련 문제