Перейти к чтению текста с горутиной

Я хочу прочитать текстовый файл с горутинами. Порядок текста, считываемого из файла, не имеет значения. Как прочитать файл с параллелизмом?

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

Например, если текстовый файл содержит I like Go, я хочу прочитать этот файл без учета порядка. Это может быть []string{"Go", "like", "I"}


person Community    schedule 28.11.2014    source источник
comment
Файловый ввод-вывод будет самой медленной частью. Использование подпрограмм go не ускорит этот процесс.   -  person fuz    schedule 28.11.2014
comment
почему ты хочешь сделать это?   -  person peterSO    schedule 28.11.2014


Ответы (1)


Прежде всего, если вы читаете из io.Reader, считайте это чтением из потока. Это единственный источник ввода, который вы не можете «прочитать параллельно» из-за его природы — под капотом вы получаете байт, ждете еще один, получаете еще один и так далее. Токенизация в словах происходит позже, в буфере.

Во-вторых, я надеюсь, вы не пытаетесь использовать горутины в качестве «серебряной пули» в стиле «давайте добавим горутины, и все просто ускорится». Если Go предоставляет такой простой способ использования параллелизма, это не значит, что вы должны использовать его везде.

И, наконец, если вам действительно нужно разбить огромный файл на слова параллельно и вы считаете, что разбиение будет узким местом (не знаю вашего случая, но очень сомневаюсь) - тогда вам придется придумывать свой алгоритм и использовать 'os' для Seek()/Read() частей файла, каждая из которых обрабатывается своей собственной gouroutine, и каким-то образом отслеживает, какие части уже были обработаны.

person divan    schedule 28.11.2014