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

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

Patricia Arquette
リリース: 2024-11-08 08:50:02
オリジナル
786 人が閲覧しました

How Can I Efficiently Read the Last Two Lines of a Large File in Go Every 10 Seconds?

Go で大きなファイルの最後の行を増分的に読み取る

このシナリオでは、大きなログの最後の 2 行を読み取ることを目的としていますファイルをメモリにロードせずに、このプロセスを 10 秒ごとに繰り返します。

提供された Go コード内スニペット:

package main

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

const MYFILE = "logfile.log"

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

func readFile(fname string){
    file, err:=os.Open(fname)
    if err!=nil{
        panic(err)
    }
ログイン後にコピー

file.Stat メソッドを利用してファイルのサイズを決定し、file.ReadAt メソッドを利用してファイル内の特定のバイト オフセットからデータを読み取ることで、その機能を拡張して目的を達成できます。

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()

    // Determine the size of the file
    stat, statErr := file.Stat()
    if statErr != nil {
        panic(statErr)
    }
    fileSize := stat.Size()

    // Assuming you know the size of each line in bytes (e.g., 62)
    start := fileSize - (62 * 2)

    // Read the last two lines from the file
    buf := make([]byte, 62 * 2)
    _, err = file.ReadAt(buf, start)
    if err == nil {
        fmt.Printf("%s\n", buf)
    }
}
ログイン後にコピー

ファイル サイズ情報とバイト オフセットの直接読み取りを利用することで、ファイル全体をメモリにロードすることなく、ファイルの最後の 2 行を効率的に読み取り、このプロセスを毎回繰り返すことができます。 10秒。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート