ホームページ >バックエンド開発 >Golang >Go で大きなファイルの最後の行を 10 秒ごとに効率的に読み取るにはどうすればよいですか?

Go で大きなファイルの最後の行を 10 秒ごとに効率的に読み取るにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-07 11:43:031013ブラウズ

How to Efficiently Read the Last Lines from a Large File in Go Every 10 Seconds?

Go で 10 秒ごとに大きなファイルの最後の行を読み取る方法

課題: 大きなログ ファイルの最後の 2 行を読み取るファイル全体をメモリにロードせずに、このプロセスを 10 秒ごとに繰り返します。

解決策: Seek または ReadAt と Stat を使用する

Stat 関数: ファイル全体のロードを回避するにはファイルの長さは、OS パッケージの Stat() 関数を使用して取得できます。これにより、ファイル サイズがバイト単位で示されます。

シークまたは前方読み取り:

  • Seek() を使用して、ファイル ポインターを適切な場所に移動できます。この位置から特定のバイト数を前方に読み込むと、目的の行がフェッチされます。
  • または、ReadAt() 関数を使用して、特定の位置から始まる特定のバイト数を読み取ることもできます。

質問に示されている例を考えてみましょう:

コード スニペット:

package main

import (
    "fmt"
    "os"
    "time"
)

const MYFILE = "logfile.log"

func main() {
    c := time.Tick(10 * time.Second)
    for _ = range c {
        readFile(MYFILE)
    }
}

func readFile(fname string) {
    file, err := os.Open(fname)
    if err != nil {
        panic(err)
    }
    defer file.Close()

    buf := make([]byte, 62)
    stat, statErr := file.Stat()
    if statErr != nil {
        panic(statErr)
    }
    start := stat.Size() - 62
    _, err = file.ReadAt(buf, start)
    if err == nil {
        fmt.Printf("%s\n", buf)
    }

}

この例では:

  • ファイルサイズの取得には Stat() 関数を使用します。
  • ReadAt() を使用して、特定の位置から 62 バイト (ファイルサイズ - 62) を読み取ります。
  • の最後の 2 行バイトとして保存されたログ ファイルが出力されます。

以上がGo で大きなファイルの最後の行を 10 秒ごとに効率的に読み取るにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。