Problème :
Liste des fichiers dans un répertoire avec un nombre extrêmement grand d'entrées (en milliards) l'utilisation de fonctions Go traditionnelles comme ioutil.ReadDir ou filepath.Glob devient inefficace. Ces fonctions renvoient des tranches triées, ce qui peut entraîner un épuisement de la mémoire.
Solution :
Au lieu de vous fier aux tranches, exploitez les méthodes Readdir ou Readdirnames avec un non nul n argument pour lire les entrées du répertoire par lots. Cela vous permet de traiter un flux d'objets os.FileInfo (ou de chaînes) sur un canal.
Implémentation :
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()) } }
Avantages :
Remarque :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!