ホームページ  >  記事  >  バックエンド開発  >  2 つの Golang 大きなファイル読み取りソリューション

2 つの Golang 大きなファイル読み取りソリューション

藏色散人
藏色散人転載
2021-01-04 14:23:182540ブラウズ

次のコラム golang チュートリアル では、Golang で非常に大きなファイルを読み取るための 2 つのソリューションを紹介します。困っている友人の役に立てば幸いです。

2 つの Golang 大きなファイル読み取りソリューション

Golang で非常に大きなファイルを読み取るための 2 つのソリューション

1. ストリーム処理方法

2. 映画処理

昨年の面接で、非常に大きなファイルをどのように扱うのですかと尋ねられました。当時はこの質問についてあまり考えていませんでした。帰国後、この問題について注意深く調べ、議論しました

たとえば、数年間実行され、サイズが 100G のログ ファイルがあります。前の操作によると、コードは次のように記述できます:

func ReadFile(filePath string) []byte{
    content, err := ioutil.ReadFile(filePath)
    if err != nil {
        log.Println("Read error")
    }
    return content
}

上記のコードは数メガバイトのファイルを読み取ることができますが、ファイルが自分自身とそのメモリよりも大きい場合は、直接ひっくり返ります。上記のコードは、ファイルのすべての内容をメモリに読み込んでからそれを返すため、数メガバイトのファイルがある場合、メモリはそれを処理できる十分な大きさですが、ファイルが数百メガバイトになると、処理できなくなります。とても簡単に加工できます。そうすると、正しい方法は 2 つあります。1 つ目は、ストリーム処理を使用することです。コードは次のとおりです。

func ReadFile(filePath string, handle func(string)) error {
    f, err := os.Open(filePath)
    defer f.Close()
    if err != nil {
        return err
    }
    buf := bufio.NewReader(f)

    for {
        line, err := buf.ReadLine("\n")
        line = strings.TrimSpace(line)
        handle(line)
        if err != nil {
            if err == io.EOF{
                return nil
            }
            return err
        }
        return nil
    }
}

2 つ目の解決策は、シャード処理です。バイナリ ファイルを読み取るとき、改行文字はありません。大きなファイルを処理するには、次のソリューションを使用してください。

func ReadBigFile(fileName string, handle func([]byte)) error {
    f, err := os.Open(fileName)
    if err != nil {
        fmt.Println("can't opened this file")
        return err
    }
    defer f.Close()
    s := make([]byte, 4096)
    for {
        switch nr, err := f.Read(s[:]); true {
        case nr < 0:
            fmt.Fprintf(os.Stderr, "cat: error reading: %s\n

関連する技術記事の詳細については、go 言語チュートリアル 列を参照してください。

以上が2 つの Golang 大きなファイル読み取りソリューションの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。