問題:
非常に多数のエントリを持つディレクトリ内のファイルのリスト(数十億単位で) ioutil.ReadDir や filepath.Glob などの従来の Go 関数を使用すると、非効率になります。これらの関数は並べ替えられたスライスを返すため、メモリが枯渇する可能性があります。
解決策:
スライスに依存する代わりに、ゼロ以外の値を指定した Readdir メソッドまたは Readdirnames メソッドを利用します。 n 引数を使用してディレクトリ エントリをバッチで読み取ります。これにより、チャネル経由で os.FileInfo オブジェクト (または文字列) のストリームを処理できるようになります。
実装:
package main import ( "fmt" "io/ioutil" "os" "path/filepath" ) func main() { // Specify the directory to list. dir := "path/to/directory" // Define a channel to receive file entries. fileEntries := make(chan os.FileInfo) // Start goroutines to read directory entries in batches. for { entries, err := ioutil.ReadDir(dir) if err != nil { fmt.Println(err) continue } if len(entries) == 0 { break } // Send each file entry to the channel. for _, entry := range entries { fileEntries <- entry } } // Process the file entries. for entry := range fileEntries { fmt.Println(entry.Name()) } }
利点:
注:
以上がGo で数十億のエントリがあるディレクトリ内のファイルを効率的に一覧表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。