Maison  >  Article  >  développement back-end  >  Comment répertorier efficacement les fichiers dans un répertoire contenant des milliards d’entrées en Go ?

Comment répertorier efficacement les fichiers dans un répertoire contenant des milliards d’entrées en Go ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-24 19:36:02216parcourir

How to Efficiently List Files in a Directory with Billions of Entries in Go?

Liste récursive des répertoires avec considérations d'efficacité

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 :

  • Évite l'épuisement de la mémoire en diffusant les entrées en continu au lieu de renvoyer une grande tranche triée.
  • Fournit plus de contrôle sur le traitement des entrées de répertoire.
  • Peut être personnalisé pour effectuer des tâches supplémentaires après avoir lu chaque lot.

Remarque :

  • Cette approche n'offre aucune garantie sur l'ordre des entrées du répertoire.
  • Vous devrez peut-être envisager de limiter le nombre de goroutines simultanées pour éviter de surcharger les ressources de votre système.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn