>  기사  >  백엔드 개발  >  Go에서 10초마다 대용량 파일의 마지막 두 줄을 효율적으로 읽을 수 있는 방법은 무엇입니까?

Go에서 10초마다 대용량 파일의 마지막 두 줄을 효율적으로 읽을 수 있는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-08 08:50:02658검색

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

Go에서 대용량 파일의 마지막 줄을 점진적으로 읽기

이 시나리오에서는 대용량 로그의 마지막 두 줄을 읽는 것을 목표로 합니다. 파일을 메모리에 로드하지 않고 이 과정을 10초마다 반복합니다.

제공된 Go 코드 내 snippet:

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

파일 크기 정보와 직접 바이트 오프셋 읽기를 활용하면 파일을 메모리에 완전히 로드하지 않고도 파일의 마지막 두 줄을 효율적으로 읽고 반복할 수 있습니다. 이 과정은 10초마다 진행됩니다.

위 내용은 Go에서 10초마다 대용량 파일의 마지막 두 줄을 효율적으로 읽을 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.