Maison > développement back-end > Golang > 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
Libérer: 2024-10-24 19:36:02
original
283 Les gens l'ont consulté

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())
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal