2012-08-07 4 views
1

나는 1000 개의 파일 모음을 gz 형식으로 가지고 있습니다. 병렬로 처리하고 싶습니다. 각 라운드마다 8 개씩 처리합니다. 모든 스레드가 파일을 열고 디스크에서 읽을 때 여러 위치에서 읽으려는 많은 프로세스로 인해 상당한 지연이 발생했습니다.버퍼링 입력 파일 및 Java 병렬 처리

여러 파일을 처리하는 효율적인 방법이 있는지 궁금합니다. 또는 모든 파일을 먼저 메모리에 버퍼링해야합니다 (예 : 8 개의 파일 모두를 버퍼로 전달). 그렇다면 파일을 버퍼링하는 가장 좋은 방법은 무엇입니까? bufferArray? 또는 몇 가지 대안 구조?

감사합니다.

답변

0

8 개의 코어가 있기 때문에 고정 크기의 풀을 사용하면 파일 압축 풀기가 CPU 사용량이 많은만큼 효율적이라는 것을 알 수 있습니다.

실제 병목 현상으로 인해 디스크에서 데이터를 읽는 중 4 개의 스레드 또는 2 개를 사용하는 것보다 빠르다는 것을 알 수 있습니다. 이럴 경우 더 빠른 디스크를 얻을 수 있습니다. 예 : 디스크를 미러링하거나 20 배 빠른 SSD를 사용하십시오.

+0

피터에게 감사드립니다. 당신 말이 맞아요. – DotNet

0

나는 당신이 1000 개의 스레드로 프로세스를 휩쓸고 있다고 생각합니다. 쓰레드는 특별히 가볍지 않습니다 (예 : 각각 스택 공간 512k를 기본으로 가져옵니다).

보다 효율적인 모델은 스레드 풀 (ThreadPoolExecutor 통해)을 사용하고 시스템에서 동시 스레드의 최적 수를 조정할 수 있습니다 (예 : 위의 8 가지를 제안 했음 -이 경첩을 어느 정도 제안 할 수 있음). 당신이 가지고있는 무료 CPU의 수에 관한 것).

.gz 파일은 실행자에게 제출 된 Callable으로 표시되며, 실행 프로그램은 여러 작업을 동시에 실행 한 후에 보게됩니다.

+0

감사합니다. 이것은 내가 현재 free cpus의 수에 기반한 고정 풀 크기로하고 있으며 각 파일은 Callable로 표현됩니다. 이것은 효율적이지 않습니다. – DotNet