问题:
列出条目数量极大的目录中的文件(数十亿)使用传统的 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中文网其他相关文章!