문제:
항목 수가 매우 많은 디렉터리의 파일 나열 (수십억 단위) ioutil.ReadDir 또는 filepath.Glob과 같은 기존 Go 기능을 사용하는 것은 비효율적입니다. 이러한 함수는 정렬된 슬라이스를 반환하므로 메모리가 고갈될 수 있습니다.
해결책:
슬라이스에 의존하는 대신 0이 아닌 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!