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 サイトの他の関連記事を参照してください。