電波ビーチ

☆(ゝω・)v

golangで巨大なファイルを読み込むときはバッファサイズ指定してあげようね

デフォルトではバッファサイズが64k(216)byteになってて辛くなってしまう場面があった。

それまで使っていたのはこういう感じの入力装置。まあよくある感じのスキャナ

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

var sc = bufio.NewScanner(os.Stdin)

func main() {
    sc.Split(bufio.ScanWords)
    text := next()
    fmt.Println(text)
}

// -*-*-*-*-*-*-*-*-
// * I/O utilities *
// -*-*-*-*-*-*-*-*-

func next() string {
    sc.Scan()
    return sc.Text()
}

で、あるとき適切に入力したはずのtextの中身が空になっていることに気づき、読み込むテキストの長さを調整(二分探索した長さの適当なテキストを出力するpythonをわざわざ書いた 明らかに徒労だけど)するとちょうど1行65535文字までは読み込めると分かった。本来なら長大な行はbufio.Readlineで読み込むのが想定されているが、めんどい。

qiita.com

そこでbufio.Scannerでも受け取れないかとググってみるとこれである。

stackoverflow.com

stackoverflow.com

ということで適当なバッファサイズを設定してやるといい。公式だとこのへんにある

golang.org

import (
    "bufio"
    "fmt"
    "os"
    "reflect"
    "strconv"
)

var sc = bufio.NewScanner(os.Stdin)

func main() {
    // バッファ設定
    buf := make([]byte, 1024*1024)
    sc.Buffer(buf, bufio.MaxScanTokenSize)
    sc.Split(bufio.ScanWords)
}

verifyはこちら

atcoder.jp