2009-09-16 8 views
1

나는 이것에 관해 어떤 조언을 구상 중이었고 링크를 발견했다. 가장 확실한 것은 this one 이었지만 궁극적으로 궁금한 점은 내 코드가 얼마나 잘 구현되는지입니다.C에서 여러 스레드에서 동일한 파일 읽기 #

기본적으로 두 가지 클래스가 있습니다. 하나는 변환기이고 다른 하나는 내가 같은 시간에 실행되어야하는 스레드 나에게 말한다 속성의 ThreadNumber을 가지고이 변환기 클래스의 인스턴스를 생성 (이이 사용자로부터 읽기) ConverterThread

입니다 이 응용 프로그램은 멀티 CPU 시스템 (물리적으로 8 cpu와 같은)에서 사용되므로 가져 오기 속도가 빨라질 것입니다.

변환기 인스턴스는 100MB에서 800MB까지의 파일을 읽습니다. 이 파일은 데이터베이스와 같은 다른 대상으로 가져온 탭 구분 값 레코드입니다.

ConverterThread 클래스는 스레드 (새 Thread (ConverterThread.StartThread)) 내에서 단순히 실행되며 이벤트 알림이 있으므로 작업이 완료되면 변환기 클래스에 알릴 수 있으며이 모든 스레드에 대한 진행률을 요약 할 수 있습니다. 이러한 레코드의 수와 얼마나 많은 바이트가 읽혔는지 사용자 (예 : GUI)에 알립니다.

파일에 대해 임의의 오류가 발생하거나 진행률 (백분율)의 합계가 100 %를 초과하여 가능한 것이 아니기 때문에 문제가있는 것처럼 보입니다. 스레드가 잘 관리되지 않고 이벤트에 의해 반환 된 정보가 잘못 되었기 때문에 발생합니다 (하나의 스레드에서 다른 스레드로 "이동"하기 때문에)

스레드의 구현에 대한 조언이 있습니까? 이것을 성취합니까?

미리 감사드립니다.

+0

여러 스레드를 사용하는 복잡성/어려움이 속도 이점보다 중요 할 것이라고 말할 때 다른 포스터의 감정에 분명히 동의합니다. –

+0

스레드를 추가하면 읽기 성능이 향상 될 수 있습니다. 나는 이것을 벤치마킹했다. http://stackoverflow.com/questions/1033065/will-using-multiple-threads-with-a-randomaccessfile-help-performance/1254378#1254378을 참조하십시오. –

+0

좋아, 그래서 마침내 큰 파일을 읽고 사용자가 스레드를 4 개의 다른 파일 에서이 큰 파일을 나눕니다 4 스레드를 설정하면 그래서 구성된 많은 파일을 만드는 하나의 스레드를 사용하여 끝났다. 쓰레드가 끝나자 마자 나는 4 개의 쓰레드를 만들고 각각은 다른 파일을 읽고 각 레코드를 처리한다. 나는 이것을 벤치마킹하지 않았지만 당신에게 알려주겠다. 모든 답변을 주셔서 감사합니다. –

답변

10

대용량 파일을 일부 코드에서 읽었습니다. 읽기 작업에 스레드를 추가하면 실제로 전체 읽기 성능이 향상된다는 주장에 회의적입니다. 사실, 스레드를 추가하면 실제로 헤드 검색이 발생하여 성능이 저하 될 수 있습니다. 이 유형의 모든 파일 작업은 CPU 경계가 아닌 I/O 경계 일 가능성이 높습니다.

당신이 언급 한 게시물의 작성자가 실제로 '실제'코드를 제공 한 적이 없다는 점을 고려할 때, 여러 스레드가 I/O를 가속화 할 것이라는 주장은 다른 사람들이 테스트 할 수없는 상태로 남아 있습니다. 스레드를 추가하여 하드 디스크 읽기/쓰기 성능을 향상시키려는 시도는 읽기간에 심각한 문제가 발생하지 않는 한 I/O 경계 일 가능성이 높습니다. 또는 디스크 캐시와 관련된 우연한 일치를 발견하게됩니다. 하드웨어 성능이 다른 다른 시스템에서 성능 향상을 재현 할 수없는 경우.

일반적으로이 크기의 파일이 포함 된 경우 스레드를 사용할 수있는 경우에도 성능이 20 % 또는 30 % 추가로 향상되지는 않습니다. 이러한 작업이 배경으로 간주 될 가능성이 가장 높기 때문입니다 작업 (실시간이 아님). 하나의 파일에서 읽기 성능을 향상시키기 때문에가 아니라 여러 파일을 백그라운드에서 동시에 처리 할 수 ​​있기 때문에이 유형의 작업에 여러 스레드를 사용합니다.

스레드를 사용하기 전에 스레드를 실제로 벤치마킹하여 스레드가 실제로 전체 처리량을 향상시킬 수 있는지 확인했습니다. 테스트 결과 (내 개발 컴퓨터에서)는 프로세서 코어 수와 동일한 수의 스레드를 사용하면 최대 처리량을 산출 할 수있었습니다. 하지만 그것은 스레드 당 하나의 파일을 처리하고있었습니다.

+0

+1, 스레드가 여기에 대한 대답이 아닙니다. –

10

한 번에 파일을 읽는 여러 스레드가 문제를 묻습니다. 프로듀서가 파일의 라인을 버퍼로 읽어 들인 다음 현재 작업 부하 처리가 완료되면 소비자 스레드로 넘겨 주도록 제작자 소비자 모델을 설정합니다. 그것은 라인이 전달되는 차단 지점을 가지고 있음을 의미하지만 처리가 읽기보다 훨씬 오래 걸린다면 큰 문제는 아닙니다. 독서가 느린 부분이라면 어쨌든 여러 소비자가 실제로 필요하지 않습니다.

+0

매우 잘, 특히 마지막 부분입니다. – Josh

+0

실제로 데이터 처리는 가장 중요한 작업입니다. 사실, 지금 내가하고있는 일은 주 스레드가 파일을 한 줄씩 읽으며 각 줄을 소비 할 때마다 해당 줄을 스레드로 전달하여 해당 정보를 처리 할 수 ​​있도록하는 것입니다. 스레드가 완료되면 스레드가 완료되었음을 알리는 이벤트가 발생하면 사용자가 지정한 것보다 더 많은 것을 만들지 않도록 새 스레드를 만들 수 있습니다 (스레드 수를 구성 할 수 있음) –

0

어쨌든 다중 스레드가 I/O에 의해 바인딩 될 가능성이 있으므로 하나의 스레드 만 파일을 읽도록하십시오. 그런 다음 여러 스레드가 파싱 할 줄을 대기열에서 제외 할 수있는 스레드 안전 큐에 줄을 공급할 수 있습니다.

스레드에 정의 된 작업량이 없으므로 스레드의 진행 상태를 알 수 없습니다. 그러나 얼마나 많은 항목 (총)이 대기열에 추가되었는지 그리고 얼마나 많은 항목이 꺼내 졌는지 추적하여 대략적인 진행 상황을 추적 할 수 있어야합니다. 분명히 파일 판독기 스레드가 대기열에 더 많은 행을 넣을 때 더 많은 행을 사용할 수 있으므로 진행률이 줄어들 것으로 보이지만 작업자가 행을 처리 할 수있는 것보다 더 빠르게 대기열을 채울 수 있어야합니다.

관련 문제