2011-12-27 3 views
4

나는이 질문을 검색하고 여기를 검색하고 내가 뭘 찾고있는 것과 유사한 것을 찾지 못했습니다.여러 스레드에서 목록을 실행하기 위해 별도의 해시 세트

Person이라는 개체가 거의없는 HashSet을 채 웠습니다. 거대한 텍스트에서이 Person을 검색하기 위해 4 ~ 5 개의 스레드를 설정해야하는데, 스레드는 하드웨어에서 더 나은 사용법을위한 최상의 솔루션 인 것처럼 보입니다.

이 HashSet을 분리하고 4 개의 스레드를 시작하려면 어떻게해야합니까? 새 HashSet 목록을 만들고이 새 해시 세트를 4로 나눈 새 스레드를 시작하려고했습니다.

좋은 해결책 인 것처럼 보이지만 더 좋은 방법이 있습니까? 해시 셋을 분리하고 4 ~ 5 개의 새 스레드로 보내려면 어떻게해야합니까?

답변

2

생산자 - 소비자 체계를 구현할 수 있습니다. 단일 스레드가 해시 집합에서 값을 하나씩 읽은 다음 큐에 넣은 다음 여러 작업자 스레드에서 처리합니다. ExecutorService 클래스를 사용하여 작업자를 관리 할 수 ​​있습니다.

편집 : 여기 당신이 할 수있는 작업은 다음과 같습니다

은 노동자 클래스 정의 메인 스레드에서

public class Worker implements Runnable { 
    private Person p; 

    public Worker(Person p) { 
     this.p = p; 
    }  

    public void run() { 
     // search for p 
    } 
} 

는 :

ExecutorService s = Executors.newCachedThreadPool(); 
for(Person p: hashSet) { 
    s.submit(new Worker(p)); 
} 
+0

ExecutorService를 구현하려면 HashSet을 분할하여 ExecutorService 클래스에서 실행되도록 보내야합니까? –

+0

@Rodrigo Ferrari : 맞습니다. 또한 한 번에 하나의 값만 보내면됩니다. ExecutorService는 스레드가 작업을 실행하는 방법을 관리합니다. – Tudor

+0

이 hashSet을 나누어 ExecutorService에 보내는 간단하고 빠른 방법이 있습니까? 샘플?내가 검색해 봤지만, 어떻게 새로 왔는지, 나는 보내고 hashSet으로부터 피드백을받는 방법을 모른다. 이것은 좋은 사용법인가? http://pcdtrabalhofinal.googlecode.com/svn/trunk/src/TestHash.java 감사합니다. –

1

은 몇 가지 고려해야 할 :

1) 동일한 해시를 사용할 수 있습니다. 설정하지만 동기화해야합니다 (호출을 synchronized 블록으로 감싸 십시 오. 그러나 당신이하는 일이 모두 해시를 찾고 있다면, 멀티 쓰레딩은 당신에게별로 사지 않을 것입니다.

2) HashSet을 분할하려는 경우 키 범위에서 분할을 고려할 수 있습니다. 예를 들어 이름을 검색하는 경우 A-F로 시작하는 이름은 HashSet1, G-L HashSet2 등으로 이동합니다. 이렇게하면 검색을 완전히 병렬로 수행 할 수 있습니다.

+0

그래, 주요 개념은 알파벳 순서에 따라 해시 셋을 분리 한 다음 긴 텍스트에서 Person 클래스의 속성 이름을 검색하는 것이다. –

1

Iterator를 사용하여 해시 세트를 통해 반복 할 수 있습니다. &을 반복하면서 값을 가져 와서 스레드를 만들고 실행하십시오. 그렇지

당신은 동시 작업을 병렬로 실행할 수 있습니다 ExecutorService를 API를 사용할 수 있습니다.

2

HashSet에 대한 액세스는 O (1)이므로 여러 스레드에서 분할하면 더 빠르게 진행되지 않습니다. 검색 파일을 분할하려고하는 것이 좋지만 비용이 많이 듭니다. 그러나 충분히 효율적이라면 하나의 스레드가 최적 일 것입니다.

컴퓨터의 모든 코어를 사용하면 프로그램 속도가 느려질 수 있음을 기억해야합니다. 컴퓨터의 모든 CPU를 모두 사용하려면 스레드 풀을 만들어 아무것도 수행하지 않고 컴퓨터의 모든 CPU를 모두 사용하십시오.

+0

그것은 처리 프로그램입니다, 그것은 사용자보기에서 실행됩니다. 멀티 스레드는 텍스트에서이 사람 이름을 검색하는 데 더 빨리 도움이 될 수 있습니다. –

+0

@RodrigoFerrari 각 스레드가 작업의 1/n을 수행 할 수 있도록 스레드간에 작업을 나누는 것을 확인하는 키. 각 스레드에서 더 작은 세트를 사용하면 각 스레드가 더 빨라지는 것을 기대하지 않을 것입니다. –

+0

검색을 빨리하면 병목 목이 IO가됩니다. 어떤 경우에는 더 많은 CPU가 아닌 더 많은 IO 하드웨어가 필요합니다. 추가 스레드가 있으면 CPU가 더 필요하지만 더 많은 메모리, 디스크 IO, 네트워크 IO, L3 캐시 등이 필요할 때 도움이됩니다. –

관련 문제