考慮效率的遞歸目錄清單
問題:
列出條目數量極大的目錄中的檔案(數十億)使用傳統的Go 函數(如ioutil.ReadDir 或filepath.Glob)變得低效。這些函數會傳回排序的切片,這可能會導致記憶體耗盡。
解:
不要依賴切片,而是利用非零值的 Readdir 或 Readdirnames 方法n 參數用於批次讀取目錄條目。這允許您透過通道處理 os.FileInfo 物件(或字串)流。
實作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | package main
import (
"fmt"
"io/ioutil"
"os"
"path/filepath"
)
func main() {
dir := "path/to/directory"
fileEntries := make(chan os.FileInfo)
for {
entries, err := ioutil.ReadDir(dir)
if err != nil {
fmt.Println(err)
continue
}
if len(entries) == 0 {
break
}
for _, entry := range entries {
fileEntries <- entry
}
}
for entry := range fileEntries {
fmt.Println(entry.Name())
}
}
|
登入後複製
優點:
- 透過串流傳輸而不是傳回大的條目而不是傳回大的條目排序切片來避免記憶體耗盡。
- 提供對目錄條目處理的更多控制。
- 可以自訂讀取每個批次後執行其他任務。
注意:
- 此方法不對目錄條目的順序提供任何保證。
- 您可能需要考慮限制並發 goroutine 的數量,以防止系統資源不堪重負。
以上是如何在 Go 中有效列出數十億條目的目錄中的檔案?的詳細內容。更多資訊請關注PHP中文網其他相關文章!