>  기사  >  백엔드 개발  >  Go에서 수십억 개의 항목이 있는 디렉터리의 파일을 효율적으로 나열하는 방법은 무엇입니까?

Go에서 수십억 개의 항목이 있는 디렉터리의 파일을 효율적으로 나열하는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-24 19:36:02216검색

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

효율성을 고려한 재귀 디렉터리 목록

문제:

항목 수가 매우 많은 디렉터리의 파일 나열 (수십억 단위) ioutil.ReadDir 또는 filepath.Glob과 같은 기존 Go 기능을 사용하는 것은 비효율적입니다. 이러한 함수는 정렬된 슬라이스를 반환하므로 메모리가 고갈될 수 있습니다.

해결책:

슬라이스에 의존하는 대신 0이 아닌 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())
    }
}

장점:

  • 큰 정렬 슬라이스를 반환하는 대신 항목을 스트리밍하여 메모리 소모를 방지합니다.
  • 디렉터리 항목 처리에 대해 더 많은 제어 기능을 제공합니다.
  • 다음에 맞게 조정할 수 있습니다. 각 배치를 읽은 후 추가 작업을 수행하십시오.

참고:

  • 이 접근 방식은 디렉토리 항목의 순서를 보장하지 않습니다.
  • 시스템 리소스가 과도하게 사용되는 것을 방지하기 위해 동시 고루틴 수를 제한하는 것을 고려해야 할 수도 있습니다.

위 내용은 Go에서 수십억 개의 항목이 있는 디렉터리의 파일을 효율적으로 나열하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.