많은 파일을 처리하는 프로그램이 있습니다. 각 파일에 대해 두 가지 작업을 수행해야합니다. 먼저 파일의 일부를 읽고 처리 한 다음 결과로 MyFileData
이됩니다. 저장된. 첫 번째 부분은 병렬화 될 수 있고 두 번째 부분은 병렬화 될 수 없습니다. CPU가 디스크 기다려야합니다 다음 조금 작동하고 또 다른 요청을 발행하고, 다시 대기로 모든 것을 순차적으로 수행여러 파일의 병렬 처리 최적화
는
은 내가 다음 않았다 ..., 매우 느립니다class MyCallable implements Callable<MyFileData> {
MyCallable(File file) {
this.file = file;
}
public MyFileData call() {
return someSlowOperation(file);
}
private final File file;
}
for (File f : files) futures.add(executorService.submit(new MyCallable(f)));
for (Future<MyFileData> f : futures) sequentialOperation(f.get());
그리고 많은 도움이되었습니다. 그러나, 나는 두 가지를 개선하기 위해 싶습니다
sequentialOperation
먼저 볼 수 있습니다 어떤 결과를 대신 처리의 고정 된 순서대로 실행됩니다. 어떻게 변경할 수 있습니까?처리 할 수천 개의 파일이 있고 수천 개의 디스크 요청을 시작하면 디스크가 손상 될 수 있습니다.
Executors.newFixedThreadPool(10)
을 사용하여이 숫자를 제한했지만보다 나은 것을 찾고 있습니다. 여러 컴퓨터에서 최적으로 작동하도록 자체 조정해야합니다 (예 : RAID 및/또는 NCQ 등을 사용할 수있는 경우 더 많은 요청을 발행하는 등). HW 구성을 찾는 데 기반 할 수 있다고 생각하지 않지만 처리 속도를 측정하고이를 기반으로 최적화하는 것은 어떻게 든이 가능해야합니다. 어떤 생각?
전에 해본 적이있는 사람과의 매우 불투명 한 이후 빠른 샘플을 할 수 있습니다 생각이있다 대답은 : 병렬 작업을 그대로 유지하면서 디스크 결과에 대한 대기열에 디스크 IO의 직렬 특성이 더 적합하다는 것입니다. – BonanzaDriver