1

나는 List<Map<String,String>>입니다. 지도 목록. 각지도는 File Name이고 Key이고 File ContentValue입니다.Executor를 Java로 사용하여 파일 쓰기

위의 목록에는 25 개 이상의 Lakh지도가 있습니다. 내 요구 사항은이 목록을 반복하고 파일을 각 Map 키와 값을 읽는 출력 폴더에 생성하는 것입니다. 그래서 결국 25 lakh Files를 갖게 될 것입니다. 그것은 4 시간 이상 걸립니다. 그런 다음 프로그램을 중단합니다. 나는 전체 25lakh 기록을 위해 프로그램을 실행하면 정확한 시간을 알 수 없다.

멀티 스레딩을 사용하여 최적화해야합니다.

어떻게 최적화 할이 사용하는 자바 Executors/ Fork/ Join (나는 Java 7이)

답변

4

당신은 내가 더 많은 스레드가 정말 도움이 될 것입니다 추가 생각하지 않습니다 하나의 디스크에 파일을 작성하는 경우. 프로그램은 CPU 사용량이 아닌 IO 바인딩입니다.

+0

이것은 가능하지만 25 개 파일을 처리하는 데 4 시간이 걸리면 많은 양의 사전 처리가 진행되며 (멀티 스레딩의 이점을 얻을 수 있음) 그렇지 않으면 엄청난 파일입니다. –

+0

가능 가능. 그러나 문제의 묘사는 그런 것을 진술하지 않습니다. 그가 설명하는 것을 기반으로하면 자신의 앱은 목록을 반복하면서 키로 파일을 만들고 파일 콘텐츠로 값을 출력합니다. – vptheron

+0

그것은 25 라크 (250 만) 파일이 아닙니다. –

0

ThreadPoolExecutorRunnable을 구현하는 클래스를 사용할 수 있습니다.

public class Processor implements Runnable { 
    private final Map<String, String> map; 

    public Processor(Map<String, String> map) { 
     this.map = map; 
    } 

    public void run() { 
     // Do work here 
    } 
} 

ThreadPoolExecutor executor = new ThreadPoolExecutor(); 
for(Map<String, String> map : list) { 
    executor.execute(new Processor(map)); 
} 
0

병렬 처리는 사용 가능한 프로세서만큼 많은 하위 문제를 나누어서 수행 할 수 있습니다. 리스트 반복자를 들어, 하위 목록을 반복 할 수 있습니다

int nThreads = Runtime.getRuntime().availableProcessors() + 1; 
ExecutorService exec = Executors.newFixedThreadPool(nThreads); 
int interval = list.size()/parallel.nThreads; 
int from  = 0; 
for(int i = 0; i < nThreads; ++i) { 
    int to = (i == nThreads - 1) ? 1000 : from + interval; 
    exec.submit(new Search(from, to, list)); 
    from = to; 
} 
exec.shutdown(); 
exec.awaitTermination(1, TimeUnit.DAYS); 

클래스 Search는 (파일 생성) 작업을 수행하는 데 사용됩니다.

Search 클래스의 :

class Search implements Runnable { 

    final int from; 
    final int to; 
    final List< Map< String, String >> list; 

    Search(int from, int to, List< Map< String, String >> list) { 
    this.from = from; 
    this.to = to; 
    this.list = list; 
    } 

    @Override 
    public void run(){ 
    for(int b = from; b < to; ++b) { 
     Map< String, String > map = list.get(b); 
     ... 
    } 
    } 
} 
0

몇 가지 참고 :

@vtheron가 말했듯이, "프로그램이 아니라 결합 된 CPU보다 바운드 IO의 이상이다", 그래서 스레드를 더 추가, 컨텍스트 스위치에서 더 많은 CPU 사이클을 낭비하게됩니다.

현재 벤치 마크는 4 시간 동안 250 만 개가됩니다. 현재 구현은 무엇입니까?

하드웨어 구성 또한 성능 향상에 중요한 역할을하며이를 고려하십시오.