2016-07-08 2 views
1

30GB (2,500 만 행)의 거대한 파일을 읽으려고합니다. 스레드 풀을 생성하고 각 스레드가 병렬로 1000 줄을 읽도록 코드를 작성하려고합니다 (첫 번째 스레드는 처음 1000 줄을 읽고 두 번째 스레드는 다음 1000을 읽습니다). 전체 파일을 읽고 스레드 풀을 만들었지 만 각 스레드가 1000 줄만 읽도록하고 다음 스레드를 읽을 필요가 없도록 읽은 ​​줄 번호를 추적 할 수있는 방법을 고수했습니다. 그 라인들. 이 모든 스레드가 라인의 거의 동일한 번호가 acceaptable의 경우멀티 스레딩을 사용하여 30GB 파일 읽기

+1

일단 문제를 해결하면 자기 드라이브를 사용하고 있습니까? 그럼에도 불구하고 이것은 IO 경계가 될 것입니다. –

+0

하나의 쓰레드가 큰 쓰레기 (30GB)를 읽는 것은 일반적으로 25000 쓰레드가 작은 쓰레기를 읽는 것보다 빠릅니다. 25000 개의 스레드에 많은 오버 헤드가 있으며, 1 개의 디스크에있는 1 개의 파일 인 경우 각 스레드는 큐에있는 액세스 시간을 기다려야합니다. –

+5

보통 하나의 스레드 만 파일과 같은 외부 리소스를 조작해야합니다. 성능을 향상시키지 않는 I/O를 배포하는 대신 독자 스레드가 각 번들을 동시 대기열에 게시하거나 실행자 작업으로 보내도록합니다. – chrylis

답변

0

A. 수행 할 수 있습니다

  1. 스레드 풀 크기가 N 인 가정, 1 스레드, 30기가바이트/N을 0 오프셋 파일 및 [0을 읽을 추구), 두 번째 스레드는 30GB/N 오프셋, 30GB/N, 30GB/N * 2 등을 읽으려고합니다.
  2. 두 번째 스레드는 줄의 시작 부분이 아니라 줄 중간 부분에있을 수 있습니다. 괜찮아. 문장을 건너 뛰고 전체 줄을 읽으십시오. 첫 번째 스레드는 부분 행으로 끝날 수 있습니다. 괜찮습니다. '\ n'을 읽을 때까지 계속 읽으십시오. 나머지 스레드는 동일한 작업을 수행합니다. 모든 스레드가 줄 정확히 euqal 수 있어야하는 경우

B., 즉 당신이 1000 선을 말할 수있다 :

  1. 인덱스 맵을 구축, 하나 개의 스레드가 전체 파일을 읽게한다. 이 맵은 line0 ~ line999가 오프셋 0에서 시작하고 line1000 ~ line1999가 오프셋 13521에서 시작하는 등의 정보를 가지고 있습니다.
  2. 모든 스레드는 그에 따라 오프셋에서 파일을 읽고 1000 행을 읽습니다.

접근법 A는 파일을 1 번 읽습니다. 접근법 B는 파일을 2 번 읽습니다.

접근 방식 A 또는 B를 사용하면 모든 스레드가 파일을 처리 (변환, 압축 풀기, 정리) 할 수 있습니다. 그러나 처리 속도가 매우 빠르면 한계는 디스크 속도입니다. 그런 다음 응용 프로그램이 IO 바운드입니다. 하나의 스레드가 파일을 읽고 직렬로 처리해야합니다.

+0

접근법 B는 내가 추구 한 논리이지만 스레드간에 이미 읽혀진 행 번호 공유 문제로 인해 상륙했습니다.파일을 읽는 단일 스레드는 파일 내용을 대기열에 넣은 다음 특정 줄에 대한 대기열을 읽는 것과 동시에 스레드 안전 카운터를 유지하여 이미 읽은 행을 나타 내기가 번거로워집니다. –

+0

"첫 번째 스레드는 먼저 읽습니다. 1000 lines "줄의 그룹을 함께 처리해야한다고 생각했습니다. 그러한 제약이 없다면 첫 번째 작은 N (1, 2, ok) 행을 읽고 첫 번째 스레드에주고 두 번째 작은 N 행을 두 번째 스레드에 제공하십시오. – waltersu

+0

@ChristineDsouza 이미 접근 방법이 있습니다. 스레드 안전 문제에 대한 코드와 질문 만 표시하십시오. – waltersu

관련 문제