首頁  >  問答  >  主體

fs.readdirSync 有多快?我可以加快速度嗎?

<p>我有一個函數,可以使用 fs.readdirSync 遞歸地取得目錄中的所有檔案。 它與我作為測試運行的小目錄配合得很好,但現在我在一個超過 100GB 的目錄上運行它,需要很長時間才能完成。關於如何加快速度或有更好的方法,有什麼想法嗎?我最終將不得不在一些包含 TB 資料的目錄上運行它。 </p> <pre class="brush:php;toolbar:false;">// Recursive function to get files function getFiles(dir, files = []) { // Get an array of all files and directories in the passed directory using fs.readdirSync const fileList = fs.readdirSync(dir); // Create the full path of the file/directory by concatenating the passed directory and file/directory name for (const file of fileList) { const name = `${dir}/${file}`; // Check if the current file/directory is a directory using fs.statSync if (fs.statSync(name).isDirectory()) { // If it is a directory, recursively call the getFiles function with the directory path and the files array getFiles(name, files); } else { // If it is a file, push the full path to the files array files.push(name); } } return 檔案; }</pre></p>
P粉064448449P粉064448449380 天前546

全部回覆(1)我來回復

  • P粉696146205

    P粉6961462052023-09-05 18:06:04

    不幸的是,非同步速度較慢。所以我們需要優化你的程式碼。您可以使用 {withFileTypes:true} 選項來完成此操作,速度增加 2 倍。

    我還嘗試過節點 v20 的 {recursive:true} 選項,但它甚至比您的解決方案還要慢。它不適用於 withFileTypes

    也許具有高讀取速度的更好 SSD 會有所幫助。雖然我猜文件條目是從檔案系統索引讀取的,但不確定硬體如何影響它。

    import fs from 'fs';
    
    const DIR = '/bytex';
    
    function getFiles(dir, files = []) {
        // Get an array of all files and directories in the passed directory using fs.readdirSync
        const fileList = fs.readdirSync(dir);
        // Create the full path of the file/directory by concatenating the passed directory and file/directory name
        for (const file of fileList) {
            const name = `${dir}/${file}`;
            // Check if the current file/directory is a directory using fs.statSync
            if (fs.statSync(name).isDirectory()) {
                // If it is a directory, recursively call the getFiles function with the directory path and the files array
                getFiles(name, files);
            } else {
                // If it is a file, push the full path to the files array
                files.push(name);
            }
        }
        return files;
    }
    
    function getFiles2(dir, files = []) {
        const fileList = fs.readdirSync(dir, { withFileTypes: true });
        fileList.forEach(file => file.isDirectory() ? getFiles2(`${dir}/${file.name}`, files) : files.push(`${dir}/${file.name}`));
        return files;
    }
    
    let start = performance.now();
    let files = getFiles(DIR);
    console.log(performance.now() - start);
    console.log(files.length);
    
    start = performance.now();
    files = getFiles2(DIR);
    console.log(performance.now() - start);
    console.log(files.length);

    輸出:

    171.66947209835052
    64508
    68.24071204662323
    64508

    回覆
    0
  • 取消回覆