首頁  >  文章  >  後端開發  >  如何在 Go 中每 10 秒有效率地讀取一個大檔案的最後一行?

如何在 Go 中每 10 秒有效率地讀取一個大檔案的最後一行?

DDD
DDD原創
2024-11-07 11:43:03934瀏覽

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

如何使用Go 每10 秒讀取大檔案的最後一行

挑戰:讀取大日誌檔案的最後兩行不將整個檔案載入到記憶體中,每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)。
  • 最後兩行然後列印以位元組形式儲存的日誌檔案。

以上是如何在 Go 中每 10 秒有效率地讀取一個大檔案的最後一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn