Problem:
Auflisten von Dateien in einem Verzeichnis mit einer extrem großen Anzahl von Einträgen (in Milliardenhöhe) wird die Verwendung herkömmlicher Go-Funktionen wie ioutil.ReadDir oder filepath.Glob ineffizient. Diese Funktionen geben sortierte Slices zurück, was zu einer Speichererschöpfung führen kann.
Lösung:
Anstatt sich auf Slices zu verlassen, nutzen Sie die Methoden Readdir oder Readdirnames mit einem Wert ungleich Null n Argument zum stapelweisen Lesen von Verzeichniseinträgen. Dadurch können Sie einen Stream von os.FileInfo-Objekten (oder Strings) über einen Kanal verarbeiten.
Implementierung:
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()) } }
Vorteile:
Hinweis:
Das obige ist der detaillierte Inhalt vonWie listet man Dateien in einem Verzeichnis mit Milliarden von Einträgen in Go effizient auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!