2014-11-28 4 views
0

goroutines을 사용하여 텍스트 파일을 읽고 싶습니다. 파일에서 읽은 텍스트의 순서는 중요하지 않습니다. 동시성이있는 파일을 읽으려면 어떻게해야합니까? 텍스트 파일 I like Go 포함 된 경우goroutine을 사용하여 텍스트를 읽으십시오.

scanner := bufio.NewScanner(file) 
for scanner.Scan() { 
    lines = append(lines, scanner.Text()) 
} 

는 예를 들어, 나는 순서와 관련된없이이 파일을 읽을 수. []string{"Go", "like", "I"}

+4

파일 IO가 가장 느린 부분이됩니다. 이동 루틴을 사용한다고해서이 프로세스의 속도가 향상되는 것은 아닙니다. – fuz

+1

왜이 작업을 수행 하시겠습니까? – peterSO

답변

3

우선, io.Reader에서 읽는 중이라면 스트림에서 읽는 것으로 간주하십시오. 그것은 하나의 입력 소스입니다. 자연스러운 관계로 '평행하게 읽을 수 없습니다'- 후드 아래에서, 바이트를 받고, 다른 것을 기다리고, 하나 더 얻는 등. 단어로 토큰 화하는 것은 나중에 버퍼에옵니다.

둘째, gouroutines를 추가하자. 모든 것이 속도가 향상 될 것입니다. 'goloutines'를 'silver bullet'으로 사용하려고하지 않았 으면합니다. Go가 동시성을 사용할 수있는 쉬운 방법을 제공한다면 모든 곳에서 사용해야한다는 것을 의미하지는 않습니다.

마지막으로 대용량 파일을 병렬로 단어로 나눌 필요가있는 경우 분할 부분이 병목 현상이 될 것이라고 생각할 수 있습니다. (귀하의 사례는 모르지만 실제로는 의심 스럽습니다) 자신의 알고리즘을 사용하고 파일의 Seek()/Read() 부분에 'os'패키지를 사용합니다. 각 파일은 자체 gouroutine으로 처리되고 어떤 부분이 이미 처리되었는지 추적합니다.

관련 문제