2017-03-14 19 views
3

Golangのstdinから大量のデータをどのように読み込みますか?私のすべての読書は現在4095バイトで止まります。 (改行が発生したとき、私はまた、スキャナを使用してみましたが、標準入力から大量のデータを読み取る

for scanner.Scan() { 
    data = append(data, scanner.Bytes()...) 
} 

を終了する方法を見つけ出すことができませんでした

var stdinReader = bufio.NewReader(os.stdin) 

// Input reads from stdin while echoing back. 
func Input(prompt string) []byte { 
    var data []byte 

    // Output prompt. 
    fmt.Print(prompt) 

    // Read until newline. 
    for { 
     bytes, isPrefix, _ := stdinReader.ReadLine() 
     data = append(data, bytes...) 

     if !isPrefix { 
      break 
     } 
    } 

    // Everything went well. Return the data. 
    return data 
} 

:私は物事の多くを試してみたが、私の現在のコードは次のようになりますすなわちユーザがリターンを押したとき)。

ReadBytes( '\ n')でも試しましたが、それでも4095バイトで停止しました。バッファのサイズを増やすことのほんの少し(これはちょっと醜いハックです)私はこの時点で何をすべきか分かりません。

+0

> 4095バイトを読み込む方法の問題に対処する前に、達成しようとしている目標は何ですか?大量のデータをバイト配列にスラーピングすることは、通常は悪い考えです。ほとんどの使用例では、パフォーマンスを向上させ、メモリ消費を抑えるために、ストリームで操作する必要があります。 – Flimzy

+0

@Flimzyそれは良い点です。それを念頭に置いておきます。私は後で入力のためにファイルを使用することを計画しているので、それはチャンク(すなわちストリーム)になります。私はstdinから4095バイト以上を読み込む慣用的な方法があるかどうか疑問に思っています。 – Awn

+0

なぜ[ReadLine](https://golang.org/pkg/bufio/#Reader.ReadLine)を使用していますか? 'stdin'に' \ n'がなければ、isPrefixが壊れてしまいますので、停止します。 'Read()'の使い方は?それは事前に知られていないので、読む@apxp – apxp

答えて

1

あなたが行くソースを見てみましょう場合、あなたはそれがデフォルトのバッファサイズを使用していることがわかります。

func NewReader(rd io.Reader) *Reader { 
    return NewReaderSize(rd, defaultBufSize) 
} 

ですから、としてあなたのコード内で使用することができます。

var stdinReader = bufio.NewReaderSize(os.Stdin, 10000) 

P.S. Goはオープンソースなので、内部を調べるだけで多くを学ぶことができます。

+0

ええ、私はバッファのサイズを変更することができますが、それは非常に素晴らしい解決策ではない知っている。 – Awn

+1

非常に良い解決策です。毎回制限を使用する必要があります。無限のリソースはありません。あなたに合ったサイズに設定してください。それはベストプラクティスです。 –

+0

解決に感謝しますが、私が探しているものではありません。私はすでにこれを考慮していて、それは私のユースケースに適合しません。 – Awn

関連する問題