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
で読み込むのが想定されているが、めんどい。
そこでbufio.Scanner
でも受け取れないかとググってみるとこれである。
ということで適当なバッファサイズを設定してやるといい。公式だとこのへんにある
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はこちら