首頁 > 後端開發 > Golang > 如何在 Go 中有效列出數十億條目的目錄中的檔案?

如何在 Go 中有效列出數十億條目的目錄中的檔案?

Barbara Streisand
發布: 2024-10-24 19:36:02
原創
336 人瀏覽過

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

考慮效率的遞歸目錄清單

問題:

列出條目數量極大的目錄中的檔案(數十億)使用傳統的Go 函數(如ioutil.ReadDir 或filepath.Glob)變得低效。這些函數會傳回排序的切片,這可能會導致記憶體耗盡。

解:

不要依賴切片,而是利用非零值的 Readdir 或 Readdirnames 方法n 參數用於批次讀取目錄條目。這允許您透過通道處理 os.FileInfo 物件(或字串)流。

實作:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板