ホームページ >バックエンド開発 >Golang >Go で数十億のエントリがあるディレクトリ内のファイルを効率的に一覧表示する方法

Go で数十億のエントリがあるディレクトリ内のファイルを効率的に一覧表示する方法

Barbara Streisand
Barbara Streisandオリジナル
2024-10-24 19:36:02283ブラウズ

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

効率を考慮した再帰的なディレクトリのリスト

問題:

非常に多数のエントリを持つディレクトリ内のファイルのリスト(数十億単位で) ioutil.ReadDir や filepath.Glob などの従来の Go 関数を使用すると、非効率になります。これらの関数は並べ替えられたスライスを返すため、メモリが枯渇する可能性があります。

解決策:

スライスに依存する代わりに、ゼロ以外の値を指定した Readdir メソッドまたは Readdirnames メソッドを利用します。 n 引数を使用してディレクトリ エントリをバッチで読み取ります。これにより、チャネル経由で os.FileInfo オブジェクト (または文字列) のストリームを処理できるようになります。

実装:

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

利点:

  • ソートされた大きなスライスを返す代わりに、エントリをストリーミングすることでメモリの枯渇を回避します。
  • ディレクトリ エントリの処理をより詳細に制御できます。
  • 次のように調整できます。各バッチの読み取り後に追加のタスクを実行します。

注:

  • このアプローチでは、ディレクトリ エントリの順序は保証されません。
  • システムのリソースが過剰になるのを防ぐために、同時実行する goroutine の数を制限することを検討する必要がある場合があります。

以上がGo で数十億のエントリがあるディレクトリ内のファイルを効率的に一覧表示する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。