Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menyenaraikan Fail dengan Cekap dalam Direktori dengan Berbilion Entri dalam Go?

Bagaimana untuk Menyenaraikan Fail dengan Cekap dalam Direktori dengan Berbilion Entri dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-10-24 19:36:02216semak imbas

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

Penyenaraian Direktori Rekursif dengan Pertimbangan Kecekapan

Masalah:

Menyenaraikan fail dalam direktori dengan bilangan entri yang sangat besar (dalam berbilion-bilion) menggunakan fungsi Go tradisional seperti ioutil.ReadDir atau filepath.Glob menjadi tidak cekap. Fungsi ini mengembalikan kepingan yang diisih, yang boleh menyebabkan keletihan memori.

Penyelesaian:

Daripada bergantung pada kepingan, manfaatkan kaedah Readdir atau Readdirnames dengan bukan sifar n hujah untuk membaca entri direktori dalam kelompok. Ini membolehkan anda memproses aliran objek (atau rentetan) os.FileInfo melalui saluran.

Pelaksanaan:

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())
    }
}

Kelebihan:

  • Mengelakkan keletihan memori dengan menstrim entri dan bukannya mengembalikan kepingan besar yang diisih.
  • Memberi lebih kawalan ke atas pemprosesan entri direktori.
  • Boleh disesuaikan dengan melaksanakan tugas tambahan selepas membaca setiap kelompok.

Nota:

  • Pendekatan ini tidak memberikan sebarang jaminan pada susunan entri direktori.
  • Anda mungkin perlu mempertimbangkan untuk mengehadkan bilangan goroutin serentak untuk mengelakkan sumber sistem anda berlebihan.

Atas ialah kandungan terperinci Bagaimana untuk Menyenaraikan Fail dengan Cekap dalam Direktori dengan Berbilion Entri dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn