問題:
列出條目數量極大的目錄中的檔案(數十億)使用傳統的Go 函數(如ioutil.ReadDir 或filepath.Glob)變得低效。這些函數會傳回排序的切片,這可能會導致記憶體耗盡。
解:
不要依賴切片,而是利用非零值的 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中文網其他相關文章!