Seberapa pantas fs.readdirSync? Bolehkah saya mempercepatkannya?
P粉064448449
P粉064448449 2023-09-04 19:48:56
0
1
544
<p>Saya mempunyai fungsi yang secara rekursif mendapatkan semua fail dalam direktori menggunakan fs.readdirSync. Ia berfungsi dengan baik dengan direktori kecil yang saya jalankan sebagai ujian, tetapi sekarang saya menjalankannya pada direktori yang melebihi 100GB dan ia mengambil masa yang lama untuk disiapkan. Sebarang idea tentang cara mempercepatkan ini atau jika ada cara yang lebih baik? Saya akhirnya perlu menjalankan ini pada beberapa direktori yang mengandungi terabait data. </p> <pre class="brush:php;toolbar:false;">// Fungsi rekursif untuk mendapatkan fail fungsi getFiles(dir, fail = []) { // Dapatkan tatasusunan semua fail dan direktori dalam direktori yang diluluskan menggunakan fs.readdirSync const fileList = fs.readdirSync(dir); // Cipta laluan penuh fail/direktori dengan menggabungkan direktori yang diluluskan dan nama fail/direktori untuk (fail const of fileList) { nama const = `${dir}/${file}`; // Semak sama ada fail/direktori semasa ialah direktori menggunakan fs.statSync jika (fs.statSync(nama).isDirectory()) { // Jika ia adalah direktori, panggil fungsi getFiles secara rekursif dengan laluan direktori dan tatasusunan fail getFiles(nama, fail); } lain { // Jika ia adalah fail, tolak laluan penuh ke tatasusunan fail files.push(nama); } } mengembalikan fail; }</pre></p>
P粉064448449
P粉064448449

membalas semua(1)
P粉696146205

Malangnya, pilihan 异步速度较慢。所以我们需要优化你的代码。您可以使用 {withFileTypes:true} untuk melakukan ini adalah 2x lebih pantas.

Saya juga mencuba {recursive:true} 选项,但它甚至比您的解决方案还要慢。它不适用于 withFileTypes dengan nod v20.

Mungkin SSD yang lebih baik dengan kelajuan bacaan tinggi akan membantu. Walaupun saya meneka entri fail dibaca dari indeks sistem fail, tidak pasti bagaimana perkakasan mempengaruhinya.

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);

Keluaran:

171.66947209835052
64508
68.24071204662323
64508
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!