Максимальный размер фрагмента строки в Go - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу ввести 200000 разделенных пробелами строк произвольных чисел.При получении ввода с помощью bufio.Reader требуется только несколько из них.Вот код:

package main

import (
    "bufio"
    "fmt"
    "io"
    "os"
    "strings"
)

func main() {
    reader := bufio.NewReaderSize(os.Stdin, 1024*1024)
    scoresTemp := strings.Split(readLine(reader), " ")
    fmt.Println(scoresTemp)
    fmt.Println("---")
    fmt.Println(len(scoresTemp))
}

func readLine(reader *bufio.Reader) string {
    str, _, err := reader.ReadLine()
    if err == io.EOF {
        return ""
    }

    return strings.TrimRight(string(str), "\r\n")
}

Длина среза должна быть 200000, но это займет всего 410 элементов.Если бы я увеличил размер ридера, он был бы таким же.Каков максимальный размер среза строк в Go ?, как с ним работать?

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Ваш код не повторяется на входе очень хорошо.Проблема не в ломтиках.
Попробуйте следующий код, если он делает то, что вы хотите.

package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {
    inputScanner := bufio.NewScanner(os.Stdin)
    inputScanner.Split(bufio.ScanWords)

    scoresTemp := make([]string, 0, 200000)
    for inputScanner.Scan() {
        scoresTemp = append(scoresTemp, inputScanner.Text())
    }

    fmt.Println(scoresTemp)
    fmt.Println("---")
    fmt.Println(len(scoresTemp))
}

Для объяснения:

  1. bufio.Scanner помогает "сканирование""определенный вклад и разделение его так, как вам нравится.По умолчанию он разделяется на новые строки.Что приводит нас к числу 2.
  2. bufio.ScanWords - это функция, которая разбивает байты на пробелы (включая новые строки).Это определяет поведение inputScanner.
  3. Далее идет фрагмент строк, где мы храним наши данные.Он инициализирован с 0 элементами и емкостью 200 000 строк.Это оптимизирует время выделения.
  4. PRINT !!
0 голосов
/ 25 ноября 2018

Я полагаю, что у вас проблема с вводом, а не с кодом Go.Я попробовал ваш код на моей локальной машине и получил такой результат:

$ for((i=0;i<200000;i++)) do echo -n "x "; done | go run main.go
...
---
200001
...