Wie listet man Dateien in einem Verzeichnis mit Milliarden von Einträgen in Go effizient auf?

Barbara Streisand
Freigeben: 2024-10-24 19:36:02
Original
226 Leute haben es durchsucht

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

Rekursive Verzeichnisauflistung mit Effizienzaspekten

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())
    }
}
Nach dem Login kopieren

Vorteile:

  • Vermeidet Speichererschöpfung durch Streaming von Einträgen, anstatt ein großes sortiertes Segment zurückzugeben.
  • Bietet mehr Kontrolle über die Verarbeitung von Verzeichniseinträgen.
  • Kann angepasst werden Führen Sie nach dem Lesen jedes Stapels zusätzliche Aufgaben aus.

Hinweis:

  • Dieser Ansatz bietet keine Garantien für die Reihenfolge der Verzeichniseinträge.
  • Möglicherweise müssen Sie darüber nachdenken, die Anzahl gleichzeitiger Goroutinen zu begrenzen, um eine Überlastung der Ressourcen Ihres Systems zu verhindern.

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!